SQLite有两个表,一个是工作,另一个不是

时间:2013-01-31 10:46:57

标签: java android sqlite

我在Android应用中有一个SQLite数据库。一个包含两个表的数据库。简单地阅读一些文本并将其读出,然而,两个表中的第一个表现完美,第二个表没有并且给出错误。我查看了我的代码,似乎都是正确的。我敢让任何人在我的代码或SQL语句中找到错误。

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

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

第一桌上的数据库操作; (完美的作品)

 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 OUTPUT;

  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仍然为空。必须找出为什么它无法在表中创建任何新行。就像之前一样,第一表工作正常,但表二仍然没有工作。

3 个答案:

答案 0 :(得分:1)

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

(...)+ KEY_DATE +“TEXT NOT NULL”;(...)

答案 1 :(得分:1)

您正在使用约束NOT NULL并且只插入一列。您必须获得SQLiteConstraintexception例外。尝试插入所有列。

答案 2 :(得分:0)

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