Articles of SQLite

数据库处理停止在Android 2.2.1上工作(Desire HD 1.72.405.3)

出于某种原因, 本文中描述的数据库处理解决scheme在获得OTA更新到2.2.1(1.72.405.3)之后不能在HTC Desire HD上运行。 它在更新之前在Desire HD上工作,并且我无法在运行2.1,2.2的实际设备以及运行所有版本的仿真器上重现错误。 不幸的是,你不能创build一个运行Android 2.2.1的模拟器的AVD,我已经尝试了基于2.2.1(我有一个根深蒂固的普通HTC Desire)的ROM,但我的应用程序工作没有问题。 所以问题是,如果它以某种方式使用Android SDK,它不应该一下子引起问题? 我知道这是一个非常具体的问题,但由于比我更多的开发人员报告这个问题,以及你不能创build一个AVD的事实,我希望这个问题被接受,我希望有人知道可能会导致这个问题。 以下是由用户发送到我的市场帐户的堆栈跟踪: Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2049) at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1917) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:889) at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168) at com.MyApp.DataBaseHelper.createDataBase(DataBaseHelper.java:81) at com.MyApp.InitialActivity.onCreate(InitialActivity.java:33) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2797) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1066) 相关的方法可以在pastebin中find。 由于只有一个超链接可以包含链接可以在下面的评论中find。 请注意,堆栈跟踪中find的第81行是pastebin中的第10行。

正常表vs虚拟表SQLite数据库

当需要search时,Android开发者手册似乎更喜欢SQLite数据库中的FTS3。 我读了FTS3的描述,它似乎创build了一个虚拟表而不是一个永久表。 虚拟表(FTS3)和SQLite的普通表有什么区别? 是虚拟表永久性,甚至在我退出应用程序后仍然在数据库中? 谢谢。

SQLite数据到一个RecyclerView

该应用程序在SQLite数据库中有数据。 UI主要是一个RecyclerView。 问题是如何最好地将数据从数据库传输到UI,同时保持主线程? 我原本计划使用CursorLoader,ContentProvider和RecyclerView。 但是阅读它看起来像RecyclerView没有对Cursor提供的数据的开箱即用的支持。 荡。 然后,我留下了几个其他的select… AsyncTask加载数据,将其放入模型对象,并传递到RecyclerView适配器。 除了丑陋之外,它不是configuration更改友好的。 一个自定义的Loader,它从SQL加载数据并将其推入模型对象。 使用Cursor加载器,当它返回Cursor迭代通过它将数据推送到模型对象。 我怀疑这会发生在主线上,可能会损害性能。 使用Otto发送请求消息以请求数据,然后通过返回消息返回模型对象集合。 可能有〜500件东西,所以我觉得我可能会更喜欢奥托这样做。 如果我使用的是模型对象而不是Cursor的集合,我看不到ContentProvider的好处,而且我也失去了UI自动刷新数据更改(这可能是有用的)的能力。 这些选项都没有吸引力,有没有更好的办法? 该应用程序是在时间压力,所以无论是需要相当快实施。 不幸的是,UI需要水平滚动,只针对棒棒糖,所以RecyclerView似乎比ListView更好。

Android Studio在SQLite杂注命令中标记错误,<pragma value> expected,得到'ON'

我认为这是一个新的错误,因为切换到Android Studio 3.0。 我收到一个lint语法错误: <pragma value> expected, got 'ON' 我只在以下两种方法中的第一种出现此错误: private static void setForeignKeyConstraintsEnabled(@NonNull SQLiteDatabase db) { if (!db.isReadOnly()) { db.execSQL("PRAGMA foreign_keys=ON;"); } } private static void setForeignKeyConstraintsDisabled(@NonNull SQLiteDatabase db) { if (!db.isReadOnly()) { db.execSQL("PRAGMA foreign_keys=OFF;"); } } 撰写时,我只在互联网上find了一个build议的修补程序 。 这是在德国,说我不应该使用常量string的杂注,但应使用string参数。 String query = String.format ("PRAGMA foreign_keys = %s","ON"); db.execSQL(query); 但我怀疑,如果这样可以消除这个错误,那么只有通过使代码太复杂才能检测到lint规则。 为什么会抛出一个错误,而不是closures ? 我的语法错了吗?

从SQLite延迟加载

我的数据库中有大约4500个条目。 在ListView中显示它们的最好方法是什么? 我应该在应用程序初始化的时候一次加载它们,还是应该使用延迟加载? 该列表也将被search和过滤。 你能不能也指点我一些好的文章,会给我一个更好的主意。 请给我build议。

如何在ListView中正确使用TextSwitcher?

我的TextSwitcher ListView每个logging应显示第一个值( text1 ),然后是另一个值( text2 ),然后再次第一个值,依此类推。 只有当text2不为空时才会发生这种情况。 否则,应始终显示text1 (没有任何更改和animation)。 我创build了Runnable() ,它改变布尔variables( time2 )然后调用items.notifyDataSetChanged() 。 它按预期工作,并在结果setViewValue()为我的ListView被调用。 这里是代码: items.setViewBinder(new SimpleCursorAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Cursor cursor, int columnIndex) { int viewId = view.getId(); switch(viewId) { case R.id.timetext: TextSwitcher itemTime = (TextSwitcher) view; if (itemTime.getChildCount() != 2) { itemTime.removeAllViews(); itemTime.setFactory(new ViewSwitcher.ViewFactory() { @Override public View makeView() […]

如何加载超过1 MB的数据从SQLite数据库到Android光标?

正是我正试图从SQLite数据库加载超过1MB的数据到android光标。 加载时出现如下错误 08-04 11:10:15.813: ERROR/CursorWindow(4465): need to grow: mSize = 2097152, size = 403719, freeSpace() = 209669, numRows = 1 08-04 11:10:15.813: ERROR/CursorWindow(4465): Attempting to grow window beyond max size (2097152) 08-04 11:10:15.813: ERROR/Cursor(4465): Failed allocating 403719 bytes for blob at 0,13 08-04 11:10:15.813: DEBUG/Cursor(4465): finish_program_and_get_row_count row 0 08-04 11:10:15.899: ERROR/CursorWindow(4465): need to grow: mSize […]

Sqlite DB与Android的一些基本问题

我想在Android中使用SQLite数据库。 我有几个问题: 有最大的数据库大小吗? 数据有多安全? 数据库在哪里存储? 数据将保留多长时间?

可能从Android SQLiteConstraintException获取具体的错误细节?

我对某些数据收到以下错误,并且概念已经足够清楚: android.database.sqlite.SQLiteConstraintException:FOREIGN KEY约束失败(代码787) 但是,这并不能帮助我find哪个特定的logging具有无效的FK。 而不是颠覆我的代码,并试图隔离每个插入与新的交易,是否有任何方式来打开(或提取)有用的细节,如问题的表格,甚至是导致麻烦的FK值? 另外,我正在使用SqlBrite,并打开了debugging日志logging(只logging操作,我仍然没有得到有关错误的更多信息) 更新:这是我自己的代码上面的所有logcat; 当试图closures先前打开的事务(BriteDatabase.Transaction)(BriteDatabase.Transaction对象是一个新的添加;我刚刚从SqlBrite 0.1.0迁移到0.4.1)时捕获exception。 android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787) at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555) at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437) at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401) at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522) at com.squareup.sqlbrite.BriteDatabase$1.end(BriteDatabase.java:85)

我怎样才能得到有关列在android sqlite中引起外键约束的信息?

我想知道是否有可能获得有关SQLiteConstraintException: foreign key constraintexception的信息。 我需要知道哪个列导致违反外键约束。 有什么办法从exception中获取这些信息吗? 如果我能得到那个约束的名字,那也是好的。