Articles of android cursor

为什么我不应该使用消息总线而不是加载器和服务?

在典型的Android项目中,我们需要以干净的方式将数据从某个地方(REST,SQL,缓存等)提取到UI中,我们通常使用Loader,Service或(可能是yuk)AsyncTask,但我发现所有这些方法由于以下几个原因不满意: 它们很难看,尤其是具有令人震惊的API结构的Loaders 它很容易被包裹在线程中,并踩在UI线程上 我们的表示层代码受到Android代码和样板的污染。 我们经常将Android对象(例如Cursors)传递到UI层,这使得一个干净的架构几乎无法实现。 这迫使我们将业务领域特定代码(理想情况下是普通Java对象)与Android平台代码混合在一起 – 对于未来开发的可读性,维护,测试或灵活性而言并不是很好。 在实践中,我们经常会遇到庞大,混乱的Activity / Fragment类。 我被这些文章中概述的想法所吸引: http : //fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ http://antonioleiva.com/mvp-android/ http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html 成功开始使用MVP将活动/碎片/视图分解为更小/更清洁的部分,我现在认为上述问题的解决方案可能是依赖于消息总线(Otto,EventBus等)而不是服务或加载器或任何与域数据交互的内容。 所以在实践中,这意味着不是使用(例如)CursorLoader从数据库加载Cursor,而是使用消息总线发送消息来请求数据,数据被加载到后台线程以响应该消息,然后通过UI线程上的消息到达时处理响应数据。 对我来说至关重要的是,我更倾向于将数据结构从业务领域推出,而不是Android域,所以我更喜欢一个业务对象数组,一个Cursor。 这是工程设计,总是需要权衡,虽然这似乎提供了更清晰的关注点分离,但是装载机/服务模板的减少,缺点是什么? 理解代码可能更难(特别是对于新开发人员) 有必要确保在正确的线程上发送和接收消息(Otto似乎在这里可能有限制) 有必要避免将所有事情都作为一种信息实施的诱惑,这最终会适得其反 传递业务对象集合可能不如使用像Cursors这样的对象。 虽然在许多情况下它在实践中是一个问题吗? 我不知道Otto / EventBus是否只是为了传递非常小的消息,或者是否适合传递更大的对象(例如业务对象数组)。 我的问题是,有没有基本的原因不采取这种基于消息的方法与Android应用程序?

无法从活页夹创建光标窗口

1 Cursor cursor = contentResolver.query(MY_URI, new String[] { “first” }, null, null, null); 2 if (cursor != null) { 3 if (cursor.moveToFirst()) { 4 first = cursor.getString(cursor.getColumnIndex(“first”)); 5 cursor.close(); 6 } 7 } 然后在第3行(根据日志),我偶尔会遇到这个例外(摘录如下): android.database.CursorWindowAllocationException: Cursor window could not be created from binder. at android.database.CursorWindow.(CursorWindow.java:134) at android.database.CursorWindow.(CursorWindow.java:41) at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:709) at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:707) at android.database.CursorWindow.newFromParcel(CursorWindow.java:718) at android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:196) […]

API Level <11的Cursor.getType()

我正在查询CallLog内容提供程序,需要检测列types。 在Honeycomb和更新版本(API Level 11+)中,您可以通过调用Cursor.getType(int columnIndex)方法获取列首选数据types,该方法返回以下types之一: FIELD_TYPE_NULL(0) FIELD_TYPE_INTEGER(1) FIELD_TYPE_FLOAT(2) FIELD_TYPE_STRING(3) FIELD_TYPE_BLOB(4) 如何在Honeycomb <11设备上实现这一目标? 我尝试过以下方法: for ( int i = 0; i < cursor.getColumnCount(); i++ ) { int columnType = -1; try { cursor.getInt( i ); columnType = Cursor.FIELD_TYPE_INTEGER; } catch ( Exception ignore ) { try { cursor.getString( i ); columnType = Cursor.FIELD_TYPE_STRING; } catch ( […]

如何在EditText中禁用光标定位和文本选择? (机器人)

我正在寻找一种方法来防止用户将光标位置移动到任何地方。 光标应始终保持在当前EditText值的末尾。 除此之外,用户不应该在EditText中选择任何内容。 您是否知道如何在Android中使用EditText实现这一点? 澄清一下:用户应该能够插入文本,但仅限于最后。

IllegalStateException:尝试使用ContentProvider查询数据库时无效的表

尝试使用下面显示的自定义ContentProvider查询我的数据库时,出现以下错误。 我已经确认表存在与正确的名称,它仍然无法正常工作。 我能够得到它与原始查询,但我想我们的ContentProvider模式进行实践。 谢谢,让我知道如果你需要更多的信息。 SQLiteOpenHelper public class DatabaseHelper extends SQLiteOpenHelper { private static final String TAG = DatabaseHelper.class.getSimpleName(); private static final String DB_PATH = "/data/data/ashton.android.personal.worktc/databases/"; private static final String DB_NAME = "worktc.db"; private static final int DB_VERSION = 1; private SQLiteDatabase myDatabase; private final Context context; public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.context […]

android服务通知活动完成的最佳方式?

我创build了一个服务,在后台线程上同步来自Web的数据,并希望在服务完成时通知列表活动,以便更新它的游标? 什么是最好的方法来做到这一点? 我正在考虑在服务完成时发送广播,但不知道这是否是最好的方法。 当服务完成后,我需要重新查询光标,所以我不确定这是否可以与广播接收机配合使用。 我有一段时间没有做很多的机器人,所以提前感谢。

如何使用联系人ID获取特定的联系人号码

这里我的联系人姓名显示在列表视图上。 通过单击列表我得到ContactName和Contact Id 。 从那我想通过使用Contact ID或Contact name获取Phone number ,请帮助我。 这是我的代码 void ReadContacts(String sort) { final Uri uri = ContactsContract.Contacts.CONTENT_URI; final String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; //boolean mShowInvisible = false; String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'"; String[] selectionArgs = null; final String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; […]

Android SQLite:试图重新打开一个已经closures的对象

我正在尝试从基于ISBN的库存表中获取某些图书数据。 但是,我收到一个错误:“尝试重新打开一个已经closures的对象”。 只有当我点击一个listView对象,转到不同的屏幕,通过“finish()”返回到这个页面,然后尝试点击另一个listView对象时,才会出现错误。 我移动了String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]); 从onClickListener到onClickListener之前的for循环 ,现在它工作。 为什么如果我在通过“finish()”从另一个活动返回到此活动后尝试getInventoryEntriesByISBN,则不起作用? SearchResultsScreen出现错误: String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]); 并通过扩展发生在InventoryAdapter上: Cursor cursor = db.rawQuery(query, new String[] {ISBN}); SearchResultsScreen.java // Set up search array for(int i = 0; i < isbn.length; i++) { searchArray.add(new InventoryItem(isbn[i], InventoryAdapter.getTitleAndAuthorByISBN(isbn[i]))); } Toast.makeText(getApplicationContext(), "searchArray.size()="+searchArray.size(), Toast.LENGTH_LONG).show(); // add data in custom adapter adapter = […]

在Android中倒置的ListView?

有没有简单的方法来显示一个ListView倒序? 我正在尝试创build一个基于对话的应用程序,并希望最近的条目位于ListView的底部。 我知道transcriptMode和stackFromBottom,但是我的问题是数据的顺序。 假设我有100个对话项目,并且希望显示项目80-100,其中100是最近的对话项目。 我想显示80-100,这意味着在我的查询ORDER BY id desc LIMIT 20,这迫使项目sorting100到80,是我所需要的相反。 我目前有一些讨厌的内部查询代码,但觉得应该有一个简单的解决scheme,基于反转游标或简单地颠倒ListView。

getSupportLoaderManager()在不同的片段中使用相同的ID?

我在一个FragmentActivity与多个ListFragments一个viewPager。 为了填充不同的列表视图,我在装载器中获得LoaderManager和initiliaze。 我想为每个片段都有一个独特的LoaderManager,但是片段没有getSupportLoaderManager()方法,所以我需要调用父片段的活动: getActivity().getSupportLoaderManager() 这种方法的问题是我的Loaders id在不同的片段中彼此冲突。 如果在一个片段中已经有多个加载器ID,那么它会变得有点麻烦。 那么是否有办法为每个片段获取唯一的LoaderManager,而不是调用父级? 我基本上希望能够在多个片段上使用相同的ID。 谢谢