4

错误:

E/Database( 8614): Failure 21 (out of memory) on 0x0 when preparing 'PRAGMA user_version = 1'.
E/Database( 8614): Failure 21 (out of memory) on 0x0 when preparing 'ROLLBACK;'.
D/Database( 8614): exception during rollback, maybe the DB previously performed an auto-rollback
D/AndroidRuntime( 8614): Shutting down VM
W/dalvikvm( 8614): threadid=3: thread exiting with uncaught exception (group=0x4001dc20)
E/AndroidRuntime( 8614): Uncaught handler: thread main exiting due to uncaught exception

我当前的代码:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {

   private static String DatabaseName = "Entries.db"; 

   public Database(Context context) {
      super(context, DatabaseName, null, 1);
   }

   public void onCreate(SQLiteDatabase D) {
      D.execSQL(
            "CREATE TABLE Containers ("
            + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "Parent INTEGER,"
            + "Sequence INTEGER,"
            + "Name TEXT"
            + ")"
      );
      D.execSQL(
            "CREATE TABLE Files ("
            + "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "Parent INTEGER,"
            + "Sequence INTEGER,"
            + "Name TEXT,"
            + "Text TEXT"
            + ")"
      );
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (0, 2, \"TestLine2\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (0, 1, \"TestLine1\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (0, 3, \"TestLine3\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (2, 1, \"TestLine2-1\")");
      D.execSQL("INSERT INTO Containers (Parent, Sequence, Name) VALUES (2, 2, \"TestLine2-2\")");
      D.close();
   }

   @Override
   public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
   }

   public static Cursor Query(Context context, String SQL) {
      StartQuerySeries(context);
      Cursor Result = Query(SQL);
      StopQuerySeries();
      return Result;
   }

   private static Database D = null;
   public static void StartQuerySeries(Context context) {
      D = new Database(context);
   }
   public static Cursor Query(String SQL) {
      SQLiteDatabase X = D.getWritableDatabase();
      return X.rawQuery(SQL, null);
   }
   public static void StopQuerySeries() {
      D.close();
      D = null;
   }

}

当在主 Activity 中这样调用它时,就会发生错误:

Database.Query(this, "INSERT INTO Files (Parent, Sequence, Name, Text) VALUES (1, 1, \"Item1\", \"Item1 Text\")");

错误发生在“D.getWritableDatabase()”行...我能找到的最接近的是,在http://www.sqlite.org/c3ref/c_abort.html上,Failure 21 显示“库使用不正确”-有什么帮助吗?

哦,我检查了 - 确实创建了数据库文件,但其中没有表,因此上面的 onCreate() 没有被调用。

4

3 回答 3

6

2分钟前我遇到了同样的问题。我通过删除D.close()线解决了它。

SQLiteDatabase当您关闭传递的对象时,似乎android不喜欢它。我认为调用该onCreate()方法的周围代码已经正确管理打开和关闭数据库。所以你只需要尽一切努力把桌子摆好。

在您创建表之后,也许对这个对象做了一些工作。我想知道这是否也能解决您的问题。

我也很想听听这种行为的确切解释。

于 2011-03-06T18:00:15.650 回答
1

非常感谢 !!!

症状:对我来说完全一样...我成功创建了数据库文件但没有创建表,并且在 LogCat 中出现以下错误

03-16 09:55:12.093: ERROR/Database(224): Failure 21 (out of memory) on 0x0 when preparing 'ROLLBACK;'.<BR>
03-16 09:55:12.093: DEBUG/Database(224): exception during rollback, maybe the DB previously performed an auto-rollback

我是如何解决的:我听从了你的建议,只是删除了我 db.execSQL("CREATE TABLE ....在 onCreate 过程中添加的“db.close”指令,我工作得很好。

于 2011-03-16T10:10:00.817 回答
0

删除方法 onCreate 中的 db.close()

@Override
public void onCreate(SQLiteDatabase db)

不要调用 SQLiteDatabas# close();

于 2011-03-29T16:26:12.010 回答