如何从Android应用程序在SQLite数据库中创建一个新表

时间:2018-03-18 20:42:58

标签: android sqlite

我遇到了创建简单应用程序的问题,这是其中一个选项: 让我们说用户输入名称和按下按钮和应用程序在具有该名称的现有数据库中创建新表。 我的DBHelper类包含下一个方法:

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

@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + tableName + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME + " TEXT, " +
            COLUMN_QUANTITY + " TEXT, " +
            COLUMN_STATUS + " INTEGER); ";
    db.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {

    db.execSQL("DROP TABLE IF EXISTS " + tableName);
    onCreate(db);
}

它在一个第一个表下工作得很完美,第一个表是我第一次使用默认名称指定的。 现在我创建一些UI并将监听器设置为按钮(我猜测细节并不重要)。监听器调用方法:

     public void createTableIfNotExists(String tableName) {
         String query = "CREATE TABLE IF NOT EXISTS " + tableName + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_NAME + " TEXT, " +
                COLUMN_QUANTITY + " TEXT, " +
                COLUMN_STATUS + " INTEGER); ";
        db = dbHelper.getWritableDatabase();
        db.rawQuery(query, null);

        Log.d("TEST", "createTableIfNotExists called");
    }

好像一切都好,但是没有创建表格!我尝试使用递增的数据库版本号调用onUpdate方法,但仍然没有结果。 我该怎么做才能解决我的问题? 请注意,表的数量可以与用户想要创建的数量一样多,但它们都是相似的(相同的模式)。

P.S。 一旦我问这个问题,有人可以解释如何从DB获取表格列表吗? 我找到了解决方案:

public List<String> getListOfLists() {
        ArrayList<String> arrTblNames = new ArrayList<String>();
        Cursor c = shoppingListDB.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
        if (c.moveToFirst()) {
            while ( !c.isAfterLast() ) {
                arrTblNames.add( c.getString( c.getColumnIndex("name")) );
                c.moveToNext();
            }
        }
        c.close();
        return arrTblNames;  

但它返回的列表有点奇怪:[android_metadata,sqlite_sequence,Newlist1]

1 个答案:

答案 0 :(得分:1)

在第二个实例中,您使用db.rawQuery而不是db.execSQL。这就是为什么没有创建表格的原因。

关于第二个问题:Android创建android_metadata表以跟踪当前数据库版本和过去的更新。 sqlite_sequence table用于管理PRIMARY KEY AUTOINCREMENT字段(它存储最高可用数字)。这是正常的,它们总是具有相同的名称(我相信..),只需将它们从列表中删除即可。