Articles of android cursor

Android MVP:在Presenter中安全使用Context

在我的应用程序中,我使用ContentProvider并使用LoaderManager.LoaderCallbacks. 片段(查看) public class ArticleCatalogFragment extends BaseFragment implements ArticleCatalogPresenter.View, LoaderManager.LoaderCallbacks { @Override public Loader onCreateLoader(int id, Bundle args) { return onCreateArticleCatalogLoader(args); } @Override public void onLoadFinished(Loader loader, Cursor data) { data.registerContentObserver(new LoaderContentObserver(new Handler(), loader)); updateUI(data); } private Loader onCreateArticleCatalogLoader(Bundle args) { int categoryId = args.getInt(CATEGORY_ID); Loader loader = new ArticleCatalogLoader(this.getActivity(), categoryId); return loader; } } […]

带有搜索实现的CursorTreeAdapter

我申请了 android和我使用CursorTreeAdapter作为ExpandableListView。 现在我想使用搜索框来显示已过滤的ExpandableListView项。 喜欢这个: 这是我到目前为止的代码: MainActivity.java : package com.example.cursortreeadaptersearch; import java.util.HashMap; import android.app.SearchManager; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.provider.ContactsContract; import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.Log; import android.widget.ExpandableListView; import android.widget.SearchView; import android.widget.SearchView.OnCloseListener; import android.widget.SearchView.OnQueryTextListener; import com.actionbarsherlock.app.SherlockFragmentActivity; public class MainActivity extends SherlockFragmentActivity { private SearchView […]

如何更新现有联系人?

我有一个现有联系人,我需要为现有联系人添加工作地址。 我使用以下代码,但它不起作用。 String selectPhone = Data.CONTACT_ID + “=? AND ” + Data.MIMETYPE + “='” + ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE + “‘” + ” AND ” + ContactsContract.CommonDataKinds.StructuredPostal.TYPE + “=?”; String[] phoneArgs = new String[] {String.valueOf(ContactId), String.valueOf( ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)}; ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) .withSelection(selectPhone, phoneArgs) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, STREET) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, CITY) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.REGION, REGION) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, POSTCODE) .withValue(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, COUNTRY) .build()); this.context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 对此有何解决方案?

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

在典型的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"; […]