Articles of SQLite

Android + Robolectric – ContentProvider中queryBuilder.query()中的RuntimeException / InstantiationException

我在ContentProvider上进行了大约十次测试,它只使用了SQLite; all pass保存在Content Provider的query()方法中通过queryBuilder.query()的两个。 正在测试的方法在实际应用中起作用! 这是API 17 r2和RoboLectric:robolectric-2.0-alpha-3-20130417.013705-46-jar-with-dependencies.jar @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.d(Constants.TAG, “MyContentProvider.query()”); switch(matcher.match(uri)) { case ITEM: // OK selection = “_id = ?”; selectionArgs = new String[]{ Long.toString(ContentUris.parseId(uri)) }; case ITEMS: // OK break; default: throw new IllegalArgumentException(“Did not recognize URI ” + […]

在现有SQLITE中创建附加表(无数据丢失)

我想在现有数据库中添加一个额外的表,而不会丢失数据。 因此删除表并创建新表是不可取的。 最好的方法是什么?

从contentProvider.update()更改uri的notifyChange

我已经实现了ContentProvider update()并使用getContext().getContentResolver().notifyChange(uri, null);通知观察者getContext().getContentResolver().notifyChange(uri, null); 我显而易见的需要是,每当只有一行生效时我想通过行特定的uri通知,但是找不到这样做的方法。 一个额外的查询,如”select id where selectionArgs”可以做到这一点,但这将是一个愚蠢的方式。 onchange(boolean, uri)得到完整的uri而不是特定的行,很容易理解这是因为ContentProvider.update()发送的是相同的。 some code for more clarity MyContentProvider的update()方法 @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.d(“TAG”, “update ” + uri.getPath()); int count = 0; switch (uriMatcher.match(uri)) { case BOOKS: count = booksDB.update(DATABASE_TABLE, values, selection, selectionArgs); break; case BOOK_ID: count = booksDB.update(DATABASE_TABLE, […]

Android如何更新,但保留数据库信息

我有一个使用SQLite数据库的应用程序。 当应用程序更新时,它会完全覆盖数据库。 当我想将用户当前进度转移到新更新时,会出现问题。 db表包含多行问题。 每行包含1个问题,答案,正确答案的原因,用户是否已应答,以及用户是否正确回答。 在更新中,可能已删除问题和/或添加其他问题。 唯一需要保留的数据是,如果问题已得到解答并且问题得到正确回答。 除了将旧数据库的每一行中的唯一数字或字符串与新数据库进行比较之外,是否有更好的方法来传输数据? 超过100行,这似乎是非常耗费资源的。 虽然我看不出另一种绕过这个问题的方法。 我们将非常感激地提出任何建议和帮助。

使用SimpleCursorAdapter保留highlite列表项

我正在使用Google的新片段(Android 3)实现splitview。 当用户从列表中选择某些内容时,它会在详细信息区域中显示值并保持列表项突出显示 。 当我使用数组适配器时,它会在添加以下内容后保持列表项集中: getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setItemChecked(postition, true); 但是当我使用SimpleCursorAdapter和自定义行xml文件更改为使用数据库时,它会在我按下时突出显示。 “我想在列表视图中保持突出显示项目”

如何在android中使用sqlite在数据库中插入值?

你能告诉我如何在数据库中插入值。 我刚开始在android开发中没有多少经验。 我只创建了一个类information ,我创建了getter和name字段的setter。 package com.example.database_example; package com.example.database_example; public class Information { String name; public Information(String name) { // TODO Auto-generated constructor stub this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 现在我创建另一个数据库类,我想在其中添加插入方法并从数据库中读取数据。 package com.example.database_example; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; […]

关于Android中SQLite数据库游标的几个问题

为了在我的应用程序中实现数据库访问,我遵循了Lars Vogel教程 ,但我对一些事情感到非常困惑…… 1)每次调用fetchTodo都会创建并返回一个新的游标。 将前一个光标留给垃圾收集器。 所以,如果我不使用startManagingCursor甚至CursorLoader那么,当我完成它时,我应该在光标上调用.close()吗? 当然,在fetchTodo范围之外,例如: Cursor cursor = mNotesAdapter.fetchTodo(); // do something… cursor.close(); 我已经完成了这个游标,并且将在下一次获取时创建新游标,如果我这样关闭它还是应该将它留给垃圾收集器? 虽然我认为我正在谈论两件完全不同的事情……重点是,我应该像上面的例子那样关闭它吗? 2) Cursor也有一个.deactivate()方法,文档说它使用的资源更少(比活动游标)。 我应该什么时候使用它? 例如,在我的应用程序中,我有一个ListActivity ,它通过SimpleCursorAdapter填充(代码初始化只调用一次)。 正在使用的游标是一个类成员variables,因为我需要在填充列表的方法之外。 当从中删除某些内容时,我需要它来重新查询数据库。 但是,除非删除记录,这是用户操作并且可能需要一段时间才能发生,我应该在此期间停用光标吗? 因为当我再次调用.requery()时它会再次激活。 或者SimpleCursorAdapter将停止工作,因为光标不活动? 编辑:我刚刚测试了这个,发现在设置游标适配器后我无法调用deactivate() 。 如果光标未激活,则列表将为空,因此只要显示ListActivity,它就需要保持活动状态。 最后,我们应该让StartManagingCursor处理它。 或者新的CursorLoader 。 3)我知道startManagingCursor / stopManagingCursor已被弃用,但我不是针对Honeycomb(至少目前stopManagingCursor ),我现在不想处理新的CursorLoader 。 但是在上面的教程中, startManagingCursor在任何地方都使用,但是stopManagingCursor永远不会被调用一次。 为什么不? Android会以自己的方式处理吗? 我应该调用stopManagingCursor任何情况?

将sqlite数据库从设备复制到PC

我有一个android程序,它将其信息存储在sqlite数据库中。 一旦设备通过USB插入,或者应该在程序本身中编写特殊function以将db内容转储到/ sdcard目录下的文件中,将该db文件复制到PC是否会直截了当? 谢谢

Android:如何创建自己的游标类?

我在Android中使用Sqlite并从数据库中获取值,我使用这样的东西: Cursor cursor = sqliteDatabase.rawQuery(“select title,category from table”, null); int columnIndexTitle = cursor.getColumnIndex(“title”); iny columnIndexCategory = cursor.getColumnIndex(“category”); cursor.moveToFirst(); while (cursor.moveToNext()) { String title = cursor.getString(columnIndexTitle); String category = cursor.getString(columnIndexCategory); } cursor.close(); 我想创建自己的Cursor,以便我可以使用一个方法执行getColumnIndex()和getString() 。 像这样的东西: String title = cursor.getString(“title”); 我想创建自己的类来扩展我从sqliteDatabase.rawQuery获得的游标,但我不知道如何实现这一点。 我应该扩展SQLiteCursor还是应该如何做? 它甚至可能是一个好主意吗?

如何在Android中解决错误“HeapWorker is wedged”?

我从服务器中获取大量数据。 我使用Get方法获得响应,我能够得到响应,但问题是解析应用程序之间的崩溃是因为某些“HeapWorker被楔入”错误。 logcat的 12-20 10:02:55.111: ERROR/dalvikvm(277): HeapWorker is wedged: 10194ms spent inside Landroid/database/sqlite/SQLiteCursor;.finalize()V 12-20 10:02:55.111: INFO/dalvikvm(277): DALVIK THREADS: 12-20 10:02:55.111: INFO/dalvikvm(277): “main” prio=5 tid=3 NATIVE 12-20 10:02:55.111: INFO/dalvikvm(277): | group=”main” sCount=1 dsCount=0 s=Y obj=0x4001b268 self=0xbd00 12-20 10:02:55.111: INFO/dalvikvm(277): | sysTid=277 nice=0 sched=0/0 cgrp=default handle=-1344001384 12-20 10:02:55.111: INFO/dalvikvm(277): at android.graphics.NinePatch.nativeDraw(Native Method) 12-20 10:02:55.111: INFO/dalvikvm(277): at android.graphics.NinePatch.draw(NinePatch.java:104) […]