无法创建Android SQLite数据库:PRAGMA错误
错误: 我当前的代码:无法创建Android SQLite数据库:PRAGMA错误,android,database,sqlite,pragma,Android,Database,Sqlite,Pragma,错误: 我当前的代码: 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 pre
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;
}
}
错误发生在“D.getWritableDatabase()”行上。。。我能找到的最接近的东西是,在那次失败中,21说“图书馆使用不正确”——有什么帮助吗
哦,我检查了-数据库文件确实被创建了,但其中没有表,因此上面的onCreate()没有被调用。我在2分钟前遇到了同样的问题。我通过删除
D.close()
行解决了这个问题
当您关闭传递的SQLiteDatabase
对象时,android似乎不喜欢它。我认为调用onCreate()
方法的周围代码已经能够正确地打开和关闭数据库。所以你只需要尽一切努力把桌子抬起来
在创建表之后,可能对这个对象做了一些工作。我想知道这是否也能解决你的问题
我也很想听到对这种行为的确切解释。非常感谢
症状:
对我来说完全一样。。。
我成功地创建了数据库文件,但没有创建表
我在LogCat中发现以下错误
Database.Query(this, "INSERT INTO Files (Parent, Sequence, Name, Text) VALUES (1, 1, \"Item1\", \"Item1 Text\")");
03-16 09:55:12.093:错误/数据库(224):准备“回滚”时0x0出现故障21(内存不足)
03-16 09:55:12.093:调试/数据库(224):回滚期间出现异常,可能是数据库之前执行了自动回滚
我是如何修复的:
我听从了你的建议,只是删除了我在后面添加的“db.close”指令
db.execSQL(“在我的onCreate过程中创建表…”
,我工作得很好。删除onCreate方法中的db.close()
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
不要调用SQLiteDatabas#close();我正要发布“不,我运气不好”,然后注意到我有两行
D.close()
行-在删除onCreate()中的一行之后
,它现在似乎起作用了。谢谢!有关此行为的解释,请参阅。现在我更感兴趣的是为什么会发生这种情况。因此,我在这里提出了一个与原因相关的新问题:
@Override
public void onCreate(SQLiteDatabase db)