首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android中插入数据时在片段中使用Sqlite数据库助手出错

在Android中插入数据时在片段中使用Sqlite数据库助手出错
EN

Stack Overflow用户
提问于 2016-01-24 23:38:12
回答 1查看 1.4K关注 0票数 -1

我绝对是Android的初学者。现在我在片段中使用Sqlite数据库时遇到错误。我的代码出了什么问题?

我的数据库助手类:

代码语言:javascript
复制
public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "todo.db";
    private static final String TABLE_NAME = "task";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_DESCRIPTION = "description";
    private static final String COLUMN_DATE ="date";
    private static final String COLUMN_DONE = "done";
    private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_DESCRIPTION+" TEXT,"+
    COLUMN_DATE+" DATE,"+COLUMN_DONE+" BOOLEAN)";
    SQLiteDatabase db;

    public DatabaseHelper(Context context)
    {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db)
    {
        this.db = db;
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String query = "DROP TABLE IF EXISTS "+TABLE_NAME;
        db.execSQL(query);
        this.onCreate(db);
    }

    public  void insertTask(Task task)
    {
        db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_DESCRIPTION,task.getDescription());
        values.put(COLUMN_DATE,task.getDate().toString());
        values.put(COLUMN_DONE,Boolean.FALSE.toString());
        db.insert(TABLE_NAME, null, values);
        db.close();
    }
}

这是我的片段类:

代码语言:javascript
复制
public class CreateTaskFragment extends Fragment{
    private DatabaseHelper dbHelper = new DatabaseHelper(getActivity());
    private Button saveBtn;
    private EditText tfDescription,tfDate;
    private int yy,mm,dd;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View view = inflater.inflate(R.layout.create_task,container,false);

        tfDescription = (EditText)view.findViewById(R.id.tf_task_description);
        tfDate = (EditText)view.findViewById(R.id.tf_task_date);
        tfDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setPickerDate(v);
            }
        });

        saveBtn = (Button)view.findViewById(R.id.btn_save_task);
        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveTask();
            }
        });

        return view;
    }

    public void setPickerDate(View v)
    {
        final Calendar calendar = Calendar.getInstance();
        int yy = calendar.get(Calendar.YEAR);
        int mm = calendar.get(Calendar.MONTH);
        int dd = calendar.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePicker = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                String date = String.valueOf(monthOfYear+1)+"/"+String.valueOf(dayOfMonth)+"/"+String.valueOf(year);
                tfDate.setText(date);
            }
        }, yy, mm, dd);
        datePicker.show();
    }

    public void saveTask()
    {
        String description = tfDescription.getText().toString();
        String date = tfDate.getText().toString();

        if(description.isEmpty())
        {
            Toast.makeText(getActivity().getBaseContext(),"Description is required",Toast.LENGTH_SHORT).show();
        }
        else if(date.isEmpty())
        {
            Toast.makeText(getActivity().getBaseContext(),"Date is required",Toast.LENGTH_SHORT).show();
        }
        else if(description.length()<getResources().getInteger(R.integer.min_description_length))
        {
            String minChar = String.valueOf(getResources().getInteger(R.integer.min_description_length));
            Toast.makeText(getActivity().getBaseContext(),"Description should be minium "+minChar+" characters",Toast.LENGTH_SHORT).show();
        }
        else{
            //check date
            SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
            boolean parseOk = false;
            Date taskDate = new Date();
            try{
                taskDate = format.parse(date);
                Task task = new Task();
                task.setDescription(description);
                task.setDate(taskDate);
                dbHelper.insertTask(task);
                parseOk = true;
            }
            catch(ParseException e)
            {
                parseOk = false;
            }

            if(parseOk)
            {
                //insert task to database
                Toast.makeText(getActivity().getBaseContext(),"Task saved",Toast.LENGTH_SHORT).show();
            }
            else{
                Toast.makeText(getActivity().getBaseContext(),"Invalid date format",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

当我点击保存按钮时。这是抛出错误。

这是我单击保存按钮后的logcat:

代码语言:javascript
复制
   01-24 15:49:30.007 575-575/? V/InputMethodService: onEvaluateInputViewShown: config.hardKeyboardHidden = 1
01-24 15:49:30.011 575-597/? E/BinaryDictionaryGetter: Could not find a dictionary pack
01-24 15:49:30.011 575-597/? E/ActivityThread: Failed to find provider info for com.android.inputmethod.latin.dictionarypack
01-24 15:49:31.167 1765-1765/? D/AndroidRuntime: Shutting down VM
01-24 15:49:31.167 1765-1765/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6206908)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime: FATAL EXCEPTION: main
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime: java.lang.NullPointerException
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at com.waiyanhein.todo.todo.DatabaseHelper.insertTask(DatabaseHelper.java:46)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at com.waiyanhein.todo.todo.CreateTaskFragment.saveTask(CreateTaskFragment.java:100)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at com.waiyanhein.todo.todo.CreateTaskFragment$2.onClick(CreateTaskFragment.java:49)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.view.View.performClick(View.java:4204)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:17355)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:725)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:92)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-24 15:49:31.167 1765-1765/? E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
01-24 15:49:31.167 415-426/? W/ActivityManager:   Force finishing activity com.waiyanhein.todo.todo/.MainActivity
01-24 15:49:31.231 415-426/? D/dalvikvm: GC_FOR_ALLOC freed 1480K, 53% free 6135K/12844K, paused 5ms, total 6ms
01-24 15:49:31.239 415-418/? D/dalvikvm: GC_CONCURRENT freed 46K, 47% free 6925K/12844K, paused 2ms+1ms, total 10ms
01-24 15:49:31.251 415-431/? D/dalvikvm: GC_FOR_ALLOC freed 107K, 45% free 7160K/12844K, paused 7ms, total 7ms
01-24 15:49:31.263 415-418/? D/dalvikvm: GC_CONCURRENT freed 1K, 36% free 8260K/12844K, paused 1ms+0ms, total 10ms
01-24 15:49:31.263 415-431/? D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 3ms
01-24 15:49:31.267 415-431/? I/dalvikvm-heap: Grow heap (frag case) to 10.614MB for 2536932-byte allocation
01-24 15:49:31.279 415-423/? D/dalvikvm: GC_FOR_ALLOC freed <1K, 30% free 10737K/15324K, paused 13ms, total 13ms
01-24 15:49:31.743 415-428/? W/ActivityManager: Activity pause timeout for ActivityRecord{5325c494 u0 com.waiyanhein.todo.todo/.MainActivity}
01-24 15:49:31.747 415-470/? I/qtaguid: Failed write_ctrl(s 1 10023) res=-1 errno=1
01-24 15:49:31.747 415-470/? W/NetworkManagementSocketTagger: setKernelCountSet(10023, 1) failed with errno -1
01-24 15:49:31.791 598-598/? W/EGL_genymotion: eglSurfaceAttrib not implemented
01-24 15:49:32.359 415-470/? I/qtaguid: Failed write_ctrl(s 0 10062) res=-1 errno=1
01-24 15:49:32.359 415-470/? W/NetworkManagementSocketTagger: setKernelCountSet(10062, 0) failed with errno -1
01-24 15:49:42.307 415-428/? W/ActivityManager: Activity destroy timeout for ActivityRecord{5325c494 u0 com.waiyanhein.todo.todo/.MainActivity}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-24 23:47:10

您得到的错误是您的片段的第101行上的空指针异常。从你的帖子中很难看出第101行代表什么,但我假设它是具有以下内容的行:

代码语言:javascript
复制
dbHelper.insertTask(task);

您在类的顶部将dbHelper声明为成员变量,但从未实例化它。相反,您只需调用:

代码语言:javascript
复制
new DatabaseHelper(getActivity());

而不会将其附加到dbHelper。将该行更改为:

代码语言:javascript
复制
dbHelper = new DatabaseHelper(getActivity());

它将有望修复您的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34977675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档