0

そこで最近、作成した SQLiteOpenHelper を拡張したクラスについて質問insert()したところ、SQLiteOpenHelper のステートメントが Logcat でエラーを引き起こしていました。最近、ddms を使用して、アプリがインターフェイスとして機能するはずのデータベースを取得し、ターミナルで表示することにしました。これが結果でした:

写真: アプリのデータベースの最近プルされたバージョンを表示している私 驚いたことに、insert ステートメントは 1 つしか表示されません (とにかく、私のアプリから)。アプリ内から複数の挿入を試みましたが、最初の「Hello world!」のみです。入れます。

何が問題なのかわからない。私のデータベースが自重である理由を理解するのを手伝ってくれる人はいますか? 私の推測では、主キーが適切にインクリメントされていませんが、その理由はわかりません。また、Logcat にエラーが表示されなくなりました。

役立つ可能性がある場合に備えて、クラスのコンストラクターを含めました。さらに、前の質問以降に getNewTaskId() に加えた変更も含めました。

public NagTasksDatabaseHelper(Context context, String name,
        CursorFactory factory, int version) {
    super(context, name, factory, version);
    // TODO Auto-generated constructor stub
}

/*
public NagTasksDatabaseHelper(Context context, String name,
        CursorFactory factory, int version,
        DatabaseErrorHandler errorHandler) {
    super(context, name, factory, version, errorHandler);
    // TODO Auto-generated constructor stub
    // NOTE TO SELF: Do not use this constructor. DatabaseErrorHandler only exists in Honeycomb onward.
}
*/
public NagTasksDatabaseHelper(Context context, CursorFactory factory){
    super(context, "NagTasks", factory, 1);
}
public NagTasksDatabaseHelper(Context context) //Most frequently use constructor
{
    super(context, "NagTasks", null, 1);
}
public int getNewTaskId(SQLiteDatabase db)
{
    Cursor c = db.rawQuery("SELECT MAX(_id) FROM TASKS", null);
    c.moveToFirst();
    int columnID = c.getColumnIndex(ID);
    if (columnID == -1)
    {
        c.close();
        return 0;
    } else {
        int newTaskID = c.getInt(columnID) +1;
        c.close();
        return newTaskID;
    }
}
public void addTask(String title, String notes)
{
    SQLiteDatabase db = getWritableDatabase();
    int newestID = getNewTaskId(db);
    ContentValues values = new ContentValues();
    values.put("_id", newestID);
    values.put("TASK", title);
    values.put("NOTE", notes);
    values.put("ISCHECKED", 0);
    db.insert("TASKS", null, values);
    db.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE IF NOT EXISTS TASKS (_id INTEGER PRIMARY KEY, TASK TEXT, NOTE TEXT, ISCHECKED INTEGER);");
}

編集:getColumnIndex()行を次のように変更しgetColumnIndexorThrow()、LogCat でこれらのエラーを取得しました:

06-17 18:47:40.557: V/LoaderManager(329): onLoadComplete: LoaderInfo{44f2ac00 #854 : SQLiteCursorLoader{44f2b950}}
06-17 18:47:40.557: V/LoaderManager(329):   onLoadFinished in SQLiteCursorLoader{44f2b950 id=854}: SQLiteCursor{44ee0800}
06-17 18:47:51.887: D/AndroidRuntime(329): Shutting down VM
06-17 18:47:51.887: W/dalvikvm(329): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-17 18:47:51.907: E/AndroidRuntime(329): FATAL EXCEPTION: main
06-17 18:47:51.907: E/AndroidRuntime(329): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mowdownDevelopments.nagTasks/com.mowdownDevelopments.nagTasks.NagTasksAddTasksActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.os.Looper.loop(Looper.java:123)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-17 18:47:51.907: E/AndroidRuntime(329):  at java.lang.reflect.Method.invokeNative(Native Method)
06-17 18:47:51.907: E/AndroidRuntime(329):  at java.lang.reflect.Method.invoke(Method.java:521)
06-17 18:47:51.907: E/AndroidRuntime(329):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-17 18:47:51.907: E/AndroidRuntime(329):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-17 18:47:51.907: E/AndroidRuntime(329):  at dalvik.system.NativeStart.main(Native Method)
06-17 18:47:51.907: E/AndroidRuntime(329): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
06-17 18:47:51.907: E/AndroidRuntime(329):  at com.mowdownDevelopments.nagTasks.NagTasksDatabaseHelper.getNewTaskId(NagTasksDatabaseHelper.java:127)
06-17 18:47:51.907: E/AndroidRuntime(329):  at com.mowdownDevelopments.nagTasks.NagTasksDatabaseHelper.getNewTaskId(NagTasksDatabaseHelper.java:141)
06-17 18:47:51.907: E/AndroidRuntime(329):  at com.mowdownDevelopments.nagTasks.NagTasksAddTaskFragment.onActivityCreated(NagTasksAddTaskFragment.java:42)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:891)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1810)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:501)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.Activity.performStart(Activity.java:3781)
06-17 18:47:51.907: E/AndroidRuntime(329):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
06-17 18:47:51.907: E/AndroidRuntime(329):  ... 11 more
06-17 18:47:58.947: I/Process(329): Sending signal. PID: 329 SIG: 9

…では、どうして「_id」が存在しないのでしょうか。古いバージョンが常に 0 を渡していたことを説明します。

4

3 に答える 3

1

私の推測では、主キーが適切にインクリメントされていませんが、その理由はわかりません。

したがって、_idインクリメントを指定しなかったため、自動インクリメントされません。したがって、onCreateメソッドを次のように置き換えます。

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE TASKS (_id INTEGER PRIMARY KEY AUTOINCREMENT, TASK TEXT, NOTE TEXT, ISCHECKED INTEGER);");
}

に指定する必要がありAUTOINCREMENTます_id

データを挿入する場所にコードを追加しませんでしたが、このアプローチinsert()では とSQLiteDatabase組み合わせて使用​​する必要がありますContentValues

public boolean addNewData(String name, String address) {
   ContentValues data = new ContentValues();
   data.put("NameColumn", name);
   data.put("AddressColumn", address);
   db.insert("TASKS", "NameColumn", data);
}

また、 inまたはmethodclose()のメソッドを呼び出す必要があります。ここにコードの断片または実装全体を追加するだけです。SQLiteonStoponDestroy


編集:

getNewTask の例

public int getNewTask(SQLiteDatabase db) {
        String SELECT_QUERY = "SELECT MAX(_id) FROM TASKS";
        Cursor c = db.rawQuery(SELECT_QUERY, null);
        if (c.getCount() > 0) {
            c.moveToFirst();
            int i = c.getInt(0);
            if (i > 0) {
                return i;
            }   
            else {
                return 0;
            }
        }
        else {
            return 0;
        }
    }
于 2012-06-14T20:31:40.933 に答える
0

したがって、問題は、渡される列名が実際にはgetColumnIndex()存在しないことでした。したがって、簡単な修正は、エイリアスをMAX(_id)...に割り当てることです。

public int getNewTaskId(SQLiteDatabase db)
{
    Cursor c = db.rawQuery("SELECT MAX(_id) AS max FROM TASKS", null);
    c.moveToFirst();
    int columnID = c.getColumnIndex("max");
    if (columnID == -1)
    {
        c.close();
        return 0;
    } else {
        int newTaskID = c.getInt(columnID) +1;
        c.close();
        return newTaskID;
    }
}

これで問題が修正されます。

于 2012-06-17T20:22:44.187 に答える
0

そんなはずないでしょ

int columnID = c.getColumnIndex("_id"); // not ID

常に 0 を返していますgetNewTaskId

于 2012-06-15T02:34:34.880 に答える