0

私は数日間、sqlitedatabaseでこの問題に悩まされてきました。

私の挿入メソッドは機能します。実行後に中断し、データベース全体をクエリして、データベースに行が含まれていることを確認します(空になる前)。これは機能します。これは、生成されたpuzzleIdを返すinsertメソッドです。

    public int savePuzzleToEdit(ContentValues puzzle, Integer puzzleId) {
      Integer id = puzzle.getAsInteger(General.ID);
      if (id == 0 && puzzleId == null) {
        puzzle.remove(General.ID);
        puzzleId = (int) ourDatabase.insert(PUZZLE_TABLE, null, puzzle);
      }else {
        ....
      }
    return puzzleId

ただし、queryメソッドは結果を返しません。つまり、カーソルは空です。

public ArrayList<ContentValues> getCreatedPuzzles(int puzzleId) {
  Cursor c = ourDatabase.query(PUZZLE_TABLE, null, "_id = " + puzzleId, null, null, null, null, null);
        while (c.moveToNext()) { // Generate return list ...}

データベースに実際に行があるかどうかを確認するために、挿入後とクエリの前にブレークを試みました。ただし、IDで選択してクエリを実行することはできません。ただし、テーブル内の他のフィールドでクエリを実行して、結果として正しい行を取得できるため、エラーがあるのは_idフィールドである必要があります。

また、データベース全体またはid以外の他のフィールドをクエリするときにも機能するrawQueryメソッドを使用しようとしました。

これはcreateステートメントです。

private static final String PUZZLE_TABLE_CREATE =
            "CREATE TABLE puzzle ( _id INTEGER, name varchar(45), category " +
                    "varchar(25), publishdate DATE, rating INT, timesplayed INT, numberOfQuestions INT);";

私が理解したように、挿入時にauto_incrementするには、idがINTEGERである必要があります。これは、insertメソッドが挿入ごとに異なるidを返すため、機能すると思います。

queryメソッドはエラーや例外を返しません。また、そのIDを持つ行がテーブルにないように見えます。返されたpuzzleIdもIDとしてテーブルに格納されていると思いますが、それは間違っている可能性がありますか?!

この問題を解決する方法についての提案や洞察をいただければ幸いです。

4

1 に答える 1

0

まず最初に、create tableステートメントが間違っている可能性があります。ステートメントで言及しない場合、_idは自動インクリメントされません。こんな感じになります

_id整数主キーの自動インクリメント

また、createtableステートメントで他のエラーがないか確認してください

于 2013-03-24T19:11:06.370 に答える