有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法使用(Begin Transaction)方法删除SQLite列

在安卓studiosqlite数据库中,我有一个带有两列(name,id)的表“title”。我想删除id列,我使用了事务处理方法,但它不起作用。 将name列复制到新表后,我希望新表本身应该有id列

     try {
            SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("db", MODE_PRIVATE, null);

    sqLiteDatabase.execSQL("BEGIN TRANSACTION");
            sqLiteDatabase.execSQL("CREATE TEMPORARY TABLE t1(name VARCHAR)");
            sqLiteDatabase.execSQL("INSERT INTO t1 SELECT name FROM title");
            sqLiteDatabase.execSQL("DROP TABLE title");
            sqLiteDatabase.execSQL("CREATE TABLE title (name VARCHAR, id INTEGER PRIMARY KEY)");
            sqLiteDatabase.execSQL("INSERT INTO title SELECT name FROM t1");
            sqLiteDatabase.execSQL("DROP TABLE t1");
    sqLiteDatabase.execSQL("COMMIT");

           } catch (Exception e) {

        }

我也试过这个

 try {
            SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("db", MODE_PRIVATE, null);

    sqLiteDatabase.execSQL("BEGIN TRANSACTION");
            sqLiteDatabase.execSQL("CREATE TEMPORARY TABLE t1(name VARCHAR,id INTEGER PRIMARY KEY)");
            sqLiteDatabase.execSQL("INSERT INTO t1 SELECT name FROM title");
            sqLiteDatabase.execSQL("DROP TABLE title");
            sqLiteDatabase.execSQL("CREATE TABLE title (name VARCHAR, id INTEGER PRIMARY KEY)");
            sqLiteDatabase.execSQL("INSERT INTO title SELECT name,id FROM t1");
            sqLiteDatabase.execSQL("DROP TABLE t1");
    sqLiteDatabase.execSQL("COMMIT");

           } catch (Exception e) {

        }

共 (1) 个答案

  1. # 1 楼答案

    您的问题是由于以下异常:

    SQLiteException: table title has 2 columns but 1 values were supplied (code 1 SQLITE_ERROR): , while compiling: INSERT INTO title SELECT name FROM t1
    

    也就是说,您没有为id列提供值

    改用

    sqLiteDatabase.execSQL("INSERT INTO title SELECT name, null FROM t1");
    

    或者

    sqLiteDatabase.execSQL("INSERT INTO title (name) SELECT name FROM t1");