0

我在 Android 应用程序中有一个 SQLite 数据库。一个数据库有两个表。简单地读入一些文本并将其读出,但是,两个表中的第一个可以完美运行,而第二个表则不能并给出错误。我查看了我的代码,它似乎都是正确的。我敢于让任何人在下面的代码或 SQL 语句中发现错误。

对 SQL 语句特别感兴趣,因为据我所知,我的 SQL 代码对于这两个表来说都是完美的,但是在 LOGCAT 中说我没有为表 2 读入的表。

为什么我的一张桌子可以工作而另一张桌子不行?然而它们在同一个数据库中并且以相同的方式编写。

第一张表上的数据库操作;(完美运行)

 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();

第二张表上的数据库操作;(不工作,错误)

 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 的建议修复了崩溃,即在创建第二个表时在 KEY_DATE 和 TEXT 之间添加一个空格。

但是仍然是一个问题,不再崩溃,但是该insert()方法仍然无效。返回 -1 表明它没有插入任何内容,并且在向表中插入新行后,表 2 仍然为空。必须找出为什么它无法在表中创建任何新行。就像之前一样,表一工作正常,但表二仍然无法正常工作。

4

3 回答 3

1

在创建第二个表时,您在 KEY_DATE 列之后和 TEXT 之前缺少一个空格。

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

于 2013-01-31T11:15:28.260 回答
1

您正在使用 Constraint NOT NULL 并且只插入一列。您一定会遇到SQLiteConstraintexception异常。尝试插入所有列。

于 2013-01-31T11:42:59.890 回答
0

您的第二个表的创建表语句可能有问题。尝试使用 sqlite3 命令行工具打开您的 db 文件,并查看该表是否存在。如果不是,则问题出在 CREATE 语句中。

于 2013-01-31T10:51:12.880 回答