我想知道是否有人可以看到我在SQLite数据库中设置2个表的错误?我在这做错了什么?我从来没有为sqlite做过多个表。
我的logcat堆栈跟踪显示错误是索引0请求,大小为0,我试图消除我在一个数据库中为SQLite设置2个表作为此错误的原因,任何想法的任何问题?
这里是下面显示的代码,其中创建了2个表
public class Database {
public static final String DATABASE_NAME = "allert_database";
public static final String DATABASE_TABLE = "allert_table";
public static final String DATABASE_TABLE2 = "allert_table2";
public static final int DATABASE_VERSION = 1;
public static final String _ID = "_id";
public static final String KEY_SENTENCE = "sentance";
public static final String KEY_DESCRIPTION = "description";
//create table DATABASE_TABLE (_ID integer primary key, Content text not null);
private static final String SCRIPT_CREATE_TABLE =
"CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_SENTENCE + " TEXT);";
// create the second table DATABASE_TABLE2
private static final String SCRIPT_CREATE_TABLE2 =
"CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE2 + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_DESCRIPTION + " TEXT);";
SQLiteDatabase sqLiteDatabase;
SQLiteHelper sqLiteHelper;
Context context;
public Database(Context c){
context = c;
}
public class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
// onCreate of the SQLiteOpenhelper only called if the database does not already exist
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SCRIPT_CREATE_TABLE);
db.execSQL(SCRIPT_CREATE_TABLE2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE2);
onCreate(db);
}
}
编辑:为了好玩我在这里添加了一个查询方法,其中stacktrace说错误是:
// get sentence from table one
public String getSentenceFromTableOne(int rowNum){
String status = " ";
String[] columns = new String[]{KEY_SENTENCE};
String selection = _ID + " = '" + rowNum + "';";
Cursor cursor = sqLiteDatabase.query(DATABASE_TABLE, columns,
selection, null, null, null, null);
if (cursor != null){
cursor.moveToFirst();
}
status = cursor.getString(cursor.getColumnIndex(KEY_SENTENCE));
cursor.close();
return status;
}
以下是main活动中的方法,该方法从数据库类
调用上面显示的数据库查询方法 public String getSentenceTableOne(int enterNum){
Database db = new Database(context);
db.openToWrite();
String returnStr = db.getSentenceFromTableOne(enterNum);
db.close();
return returnStr;
}
编辑2:我将进一步调查,但为了完整性,我在这里添加了我的sqlite帮助程序类的实例化,或者它是如何完成的
SQLiteDatabase sqLiteDatabase;
SQLiteHelper sqLiteHelper;
Context context;
public Database(Context c){
context = c;
}
public void openToRead() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getReadableDatabase();
}
public void openToWrite() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
}
最终编辑:提出问题的原因,如果我在数据库中实现多个表有任何问题。这回答了,但我发现真正的错误是从主类调用错误的方法,我从主类的insert方法调用数据库类中的update方法。这就是没有新信息插入数据库的原因。
答案 0 :(得分:0)
看起来光标是空的。所以.moveToFirst()
无效,因为没有第一个。
而不仅仅是
if (cursor != null)
尝试
if (cursor != null && cursor.getCount > 0)
确保您确实拥有数据。如果您这样做,并且没有显示,请仔细查看您的查询。
此外,不是像这样创建你的选择:
String selection = _ID + " = '" + rowNum + "';";
我会使用这样的变量:
String selection = _ID + "= ?";
String [] args = new String[] {String.valueOf(rowNum)};
...
Cursor cursor = sqLiteDatabase.query(DATABASE_TABLE, columns,
selection, args, null, null, null);
这有助于防止字符串连接问题导致查询失败。
编辑:还要确保你实际上也在某处实例化sqLiteHelper,我认为这并不是你所有的代码。