无法创建Android SQLite数据库:PRAGMA错误

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;
   }

}

错误发生在主要活动中,当它被这样调用时:

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 上的失败代码21表示“库使用不正确”,有什么帮助吗?
哦,我检查过了 - 数据库文件确实被创建了,但里面没有表,所以上面的onCreate()方法没有被调用。
3个回答

6

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

似乎安卓不喜欢关闭传递的SQLiteDatabase对象。我认为调用onCreate()方法的周围代码已经正确地管理了打开和关闭数据库。所以你只需要做好创建表格的所有工作即可。

也许在创建表格后对该对象进行了一些工作。我想知道这是否也解决了你的问题。

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


我本来要发帖子说“对我没用,没有运气”,但是后来注意到我有两个D.close()行 - 在删除了onCreate()中的一个之后,现在似乎可以工作了。谢谢! - Izkata
请参考http://stackoverflow.com/questions/5324241/what-happens-to-sqlitedatabase-object-which-is-passed-to-oncreate-method 了解此行为的解释。 - Chris

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

我是如何解决的: 我按照您的建议,只需在我的onCreate过程中删除一个“db.close”指令,它就可以完美地工作了。

现在我对这种情况更感兴趣了。因此,我在这里开了一个新的问题,与原因有关:http://stackoverflow.com/questions/5324241/what-happens-to-sqlitedatabase-object-which-is-passed-to-oncreate-method - Chris

0

在 onCreate 方法中移除 db.close()。

@Override
public void onCreate(SQLiteDatabase db)

不要调用SQLiteDatabas# close();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接