
现在大约有300人使用我的AndroID应用程序,每次使用此堆栈跟踪向服务器发送崩溃报告时:
androID.database.sqlite.sqliteDatabaseCorruptException: database disk image is malformed at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2596) at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621) at androID.app.ActivityThread.access00(ActivityThread.java:126) at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1932) at androID.os.Handler.dispatchMessage(Handler.java:99) at androID.os.Looper.loop(Looper.java:123) at androID.app.ActivityThread.main(ActivityThread.java:4595) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:618) at dalvik.system.NativeStart.main(Native Method) Caused by: androID.database.sqlite.sqliteDatabaseCorruptException: database disk image is malformed at androID.database.sqlite.sqlitequery.native_fill_window(Native Method) at androID.database.sqlite.sqlitequery.fillWindow(sqlitequery.java:75) at androID.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:295) at androID.database.sqlite.sqliteCursor.getCount(sqliteCursor.java:276) at androID.database.AbstractCursor.movetoposition(AbstractCursor.java:171) at androID.database.AbstractCursor.movetoFirst(AbstractCursor.java:248)
结果是应用程序崩溃并且数据库中的所有数据都丢失了.
需要注意的一点是,每次我读取或写入数据库时,我都会得到一个新的sqliteDatabase,并在完成后立即将其关闭.我这样做是为了防止这种腐败错误.
我还尝试使用单个静态对象同步所有数据库读取和写入,这似乎没有帮助.
这可能只是一个sqlite错误吗?
我在这里找到了与内置电子邮件应用程序类似的错误:http://code.google.com/p/android/issues/detail?id=5610.
这是我的代码:
public class keyvaluetableAdapter extends BasetableAdapter { private String tablename; private String keyColumnname; private String valueColumnname; public keyvaluetableAdapter(Context context,String tablename,String keyColumnname,String valueColumnname) { super(context); this.tablename = tablename; this.keyColumnname = keyColumnname; this.valueColumnname = valueColumnname; } protected String getStringValue(int key) { Cursor cursor = null; sqliteDatabase db = null; String value; try { db = dbOpenHelper.getReadableDatabase(); cursor = db.query(true,tablename,new String[] { valueColumnname },keyColumnname + "=" + key,null,null); if ((cursor.getCount() == 0) || !cursor.movetoFirst()) { value = null; } else { value = cursor.getString(0); } } finally { if (cursor != null) cursor.close(); if (db != null) db.close(); dbOpenHelper.close(); } return value; }}public abstract class BasetableAdapter { protected DbOpenHelper dbOpenHelper; public BasetableAdapter(Context context) { this.dbOpenHelper = new DbOpenHelper(context,DatabaseSettings.DATABASE_name,DatabaseSettings.DATABASE_VERSION); }}解决方法 “the DB holds session information so
it’s not very feasible to do a backup.
The data changes by the minute”
您应该尝试使用SharedPreferences:它存储键值对(在后台,它使用文件).
存储值:
SharedPreferences sp=MyActivity.getSharedPreferences("name",Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();editor.putString("key",value);editor.putBoolean("another",true);editor.commit(); 检索数据:
sp.getString("key","Not found"); // "Not found" is the default value// if sp does not contain the specifIEd keysp.getBoolean("another",false); // false is the default value// if sp does not contain the specifIEd key 有关更详细的说明,请参见getSharedPreferences和SharedPreferences.
总结以上是内存溢出为你收集整理的Android SQLite数据库已损坏全部内容,希望文章能够帮你解决Android SQLite数据库已损坏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)