在SQLite数据库中设置2个表,这里有什么问题吗?

时间:2013-06-11 08:05:09

标签: android sqlite cursor

我想知道是否有人可以看到我在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方法。这就是没有新信息插入数据库的原因。

1 个答案:

答案 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,我认为这并不是你所有的代码。