0

Android アプリに SQLite データベースがあります。2 つのテーブルを持つ 1 つのデータベース。いくつかのテキストを読み込んで読み上げるだけですが、2 つのテーブルのうち最初のテーブルは完全に機能し、2 番目のテーブルは機能せず、エラーが発生します。私は自分のコードを見てきましたが、すべて正しいようです。以下のコードまたは SQL ステートメントでエラーを見つけることは誰にでもあります。

私の知る限り、SQLコードは両方のテーブルで完璧であるため、特にSQLステートメントに興味がありますが、LOGCATには、テーブル2に対して読み取っているテーブルがないことが示されています。

テーブルの 1 つが機能し、もう 1 つが機能しないのはなぜですか? それでも、それらは同じデータベースにあり、同じ方法で書かれています。

最初のテーブルでのデータベース操作。(完璧に動作します)

 ourHelper = new DbHelper(ourContext);
 ourDatabase = ourHelper.getWritableDatabase();

 ContentValues cv = new ContentValues();
 cv.put(KEY_NAME, name);
 cv.put(KEY_HITS, hits);
 ourDatabase.insert(DATABASE_TABLE_1, null, cv);

 public String getData() {
     String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_HITS };
     Cursor c = ourDatabase.query(DATABASE_TABLE_1, columns, null, null, null,
             null, null);
     String result = "";

     int iRow = c.getColumnIndex(KEY_ROWID);
     int iName = c.getColumnIndex(KEY_NAME);
     int iHits = c.getColumnIndex(KEY_HITS);

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
         result = result + c.getString(iRow) + " " + c.getString(iName)
                 + " " + c.getString(iHits) + "\n";
     }

     return result;
    }


 ourHelper.close();

2 番目のテーブルでのデータベース操作。(動作しない、エラー)

 ourHelper = new DbHelper(ourContext);
 ourDatabase = ourHelper.getWritableDatabase();

 ContentValues cv = new ContentValues();
 cv.put( KEY_RESULT, result);
 return ourDatabase.insert(DATABASE_TABLE_2, null, cv);

 public String getData2() {
     // TODO Auto-generated method stub
 String[] columns = new String[] { KEY_ROWID, KEY_RESULT, KEY_TABLET, KEY_DATE };
   Cursor c = ourDatabase.query(DATABASE_TABLE_2, columns, null, null, null,
             null, null);
     String result = "";

     int iRow = c.getColumnIndex(KEY_ROWID);
     int iResult = c.getColumnIndex(KEY_RESULT);
     int iTablet = c.getColumnIndex(KEY_TABLET);
     int iDate = c.getColumnIndex(KEY_DATE);

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
         result = result + c.getString(iRow) + " " + c.getString(iResult)
               + " " + c.getString(iTablet) + " " + c.getString(iDate) + "\n";
     }
     return result;
    }

    ourHelper.close();

LOGCAT 出力;

  01-31 19:33:01.670: E/AndroidRuntime(6420): FATAL EXCEPTION: main

01-31 19:33:01.670: E/AndroidRuntime(6420):
java.lang.RuntimeException: Unable to start activity ComponentInfo{DBView}:
android.database.sqlite.SQLiteException: no such column: date: , while compiling:
SELECT _id, game_result, tablet_winner, date FROM prizeTable

詳細については、より多くのコードを参照してください。

public class PlayGame {

public static final String KEY_ROWID="_id";

// for table 1 gameTable
public static final String KEY_NAME="persons_name";
public static final String KEY_HITS="persons_hits";

// for table 2 prizesTable
public static final String KEY_RESULT="game_result";
public static final String KEY_TABLET="tablet_winner";
public static final String KEY_DATE="date";


private static final String DATABASE_NAME="PlayGamesdb";
private static final String DATABASE_TABLE_1="gameTable";
private static final String DATABASE_TABLE_2="prizeTable";
private static final int DATABASE_VERSION = 1;

private static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE_1 + " (" + KEY_ROWID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME + " TEXT NOT NULL, " + KEY_HITS + " TEXT NOT NULL);";

private static final String CREATE_TABLE_2 = "CREATE TABLE " + DATABASE_TABLE_2 + " (" + KEY_ROWID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_RESULT + " TEXT NOT NULL, " + KEY_TABLET
        + " TEXT NOT NULL, " + KEY_DATE + "TEXT NOT NULL);";

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

  private static class DbHelper extends SQLiteOpenHelper{  

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_1);
        db.execSQL(CREATE_TABLE_2); 
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_1 + "AND" + DATABASE_TABLE_2);
        onCreate(db);
    }
}

<<< 編集 >>>

Safime の提案により、2 番目のテーブルの作成時に KEY_DATE と TEXT の間にスペースが追加されるというクラッシュが修正されました。

ただし、まだ問題があり、クラッシュすることはありませんが、insert()メソッドはまだ機能していません。-1 の戻り値を取得すると、何も挿入されていないことが示され、新しい行をテーブルに挿入した後もテーブル 2 はまだ空です。テーブルに新しい行を作成できない理由を見つけなければなりません。前と同じように、テーブル 1 は正常に動作しますが、テーブル 2 はまだ動作していません。

4

3 に答える 3

1

2 番目のテーブルの作成時に、列 KEY_DATE の後と TEXT の前に空のスペースがありません。

(...) + KEY_DATE + " TEXT NOT NULL); (...)

于 2013-01-31T11:15:28.260 に答える
1

Constraint NOT NULL を使用しており、1 つの列にのみ挿入しています。あなたはSQLiteConstraintexception例外を取得している必要があります。すべての列に挿入してみてください。

于 2013-01-31T11:42:59.890 に答える
0

おそらく、2番目のテーブルのcreatetableステートメントで問題が発生しています。sqlite3コマンドラインツールを使用してdbファイルを開き、このテーブルが終了するかどうかを確認してください。そうでない場合、問題はCREATEステートメントにあります。

于 2013-01-31T10:51:12.880 に答える