【问题标题】:Android SQLite Alter table rename not commitAndroid SQLite Alter 表重命名未提交
【发布时间】:2013-12-01 18:20:19
【问题描述】:

提前致谢。

我需要在我的应用程序的新版本中重新构建我的数据库,然后为此目的在我的 SQLiteOpenHelper 类中使用 onUpgrade 方法。

好吧,我需要重命名一些列,而在 sqlite 中这是不可能的,我决定创建另一个表,导入所有数据,然后删除旧表并重命名新表。全部在“onUpgrade”方法中......好吧,在方法结束时我需要将数据库上传到服务器,当我走思考表时,我发现游标返回空指针,因为它没有找到新字段,但实际上当我去 DDMS 中的文件资源管理器并从我的手机查看数据库,我看到里面有字段。 似乎没有提交更改,但我为此使用了 databasetransaction。

我做错了什么?

我在 onupgrade 中的代码是这样的:

public void onUpgrade(final SQLiteDatabase db, int oldVersion, int newVersion) {

if(oldVersion==22 && newVersion==23){

try {
   db.beginTransaction();

   db.execSQL("CREATE TABLE unidades2 (uuid text, nombre TEXT)");

   c=db.rawQuery("SELECT * FROM unidades",null);
   c.moveToFirst();
   while(!c.isAfterLast()){
         auxuuid=new uuid().toString();
         db.execSQL("INSERT INTO unidades2(uuid, nombre) VALUES (?,?)",new String[] {auxuuid,c.getString(1)});
         c.moveToNext();
   }
   c.close();
   db.execSQL("DROP TABLE unidades");
   db.execSQL("ALTER TABLE unidades2 RENAME TO unidades");

   db.setTransactionSuccessful();
}
finally db.endTransaction();

}
}

然后用光标穿过 unidades 表,然后执行:

try {
   db.beginTransaction();

   Cursor cursor = db.rawQuery("SELECT * FROM unidades",null);
   cursor.moveToFirst();
   int hasuuid= cursor.getColumnIndex("uuid");
   cursor.close();

   [Code uploading database in JSON]

   db.setTransactionSuccessful();
}
finally db.endTransaction();

hasuuid 它的 -1。

请帮帮我!!非常感谢。

【问题讨论】:

  • 您的描述暗示数据库已升级,但未上传。
  • 哦,好吧......我没有正确解释,我将使用“无意义”代码编辑我的答案。谢谢。

标签: android database sqlite commit


【解决方案1】:

一个可能导致问题的问题虽然在您发布的 sn-ps 中并不明显:onUpgrade() 已在事务中运行。 sqlite 本身不支持嵌套事务。顶部的 Android 包装器添加了部分支持,以便嵌套事务仅在提交或回滚最外层事务时才提交或回滚。在这种情况下,最外层事务是在调用onUpgrade() 之前设置的事务。因此,当您认为自己提交时,不会在 sqlite 数据库级别执行实际提交。

【讨论】:

  • 嗯...有趣...我认为这可能是解决方案,让我测试一下。
  • 是的!那是我的错误!然后我在 onupgrade 结束时进行重命名,并根据新的 unidades2 表进行上传。非常感谢!!
猜你喜欢
  • 2020-06-19
  • 2012-01-02
  • 2016-02-12
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
相关资源
最近更新 更多