我是一个新手Android程序员,我最近跟着一个教程,该教程展示了如何创建一个本地SQLite数据库,然后使用SQLiteDatabase.rawQuery来返回一个Cursor来访问数据库.我想修改我的应用程序以使用CursorLoader,这显然是访问数据库的更好方法.我的问题是CursorLoader构造函数需要给出一个URI.我只输入"file:/// [db to path]"?似乎有点凌乱.
谷歌文档指出不使用第CursorAdapters一个构造函数,
CursorAdapter(Context context, Cursor c)
Run Code Online (Sandbox Code Playgroud)
只有两个选项,
CursorAdapter(Context context, Cursor c, boolean autoRequery)
Run Code Online (Sandbox Code Playgroud)
这说
允许控制自动重新查询的构造函数.建议您不要使用它,而是使用CursorAdapter(Context,Cursor,int).使用此构造函数时,将始终设置FLAG_REGISTER_CONTENT_OBSERVER
和
CursorAdapter(Context context, Cursor c, int flags)`
Run Code Online (Sandbox Code Playgroud)
这说它是推荐的构造函数.
问题是这里只有两个标志用于最后一个构造函数,FLAG_AUTO_REQUERY(int 1)和FLAG_REGISTER_CONTENT_OBSERVER(int 2).使用FLAG_AUTO_REQUERY没有意义,因为我现在使用CursorLoader在后台管理它并更新它.有FLAG_REGISTER_CONTENT_OBSERVER,它表示使用时不需要CursorLoader.
现在我问,我通过什么整数CursorAdapter(Context context, Cursor c, int flags)才能使它与我的工作正常CursorAdapter?让我担心的是如何正确管理旧光标.我不确定这样做的正确方法.
如果我使用FLAG_REGISTER_CONTENT_OBSERVER,那么我必须做一些事情onContentChanged(),但swapCursor()在我使用时LoaderManager,由于光标未关闭,我可以做adapter.swapCursor(cursor).close().但会与冲突onContentChanged()的CursorAdapter?目标是不会导致任何内存泄漏并且效率很高.
android android-contentprovider android-loadermanager android-cursorloader android-cursoradapter
我试图了解loadermanager做了什么.任何人都可以与它共享一个例子吗?我创建游标时必须使用它们吗?如果不是我应该如何使用?非常感谢一个简单的例子.
android android-cursor android-loadermanager android-cursorloader
我想了解一些事情,我相信这对某些人来说是非常基本的.
我到处读到不推荐使用startManagingCursor方法,你应该使用CursorLoader类.但这是否意味着即使对于支持API级别<11的应用程序,您也应该使用CursorLoader类?或者它是说如果你打算只支持Honeycomb,那么那么使用cursorLoader?
我似乎无法使用api 4导入游标加载器类,所以我假设使用CursorLoader在Android 3.0+之前不适用,但有人可以为我验证吗?
谢谢
我正在阅读文档,但我仍然不太确定.它说要使用getContentResolver(),但那时确实没有使用CursorLoader.那么有办法实现CursorLoader吗?我知道如何做到这一点query().步骤非常相似吗?即使只是一个可以解释这一点的链接也会有所帮助.
请注意,请勿将我链接到Google文档,因为他们没有使用insert()ContentProvider使用方法的示例CursorLoader.
提前致谢!!
编辑:我应该提到我与此混淆的原因是因为调用一个新的CursorLoader自动调用ContentProviders query()方法.但是如何才能为插入做同样的事情呢?
android android-contentresolver android-contentprovider android-loadermanager android-cursorloader
考虑如下图所示的场景:
三张照片,其中一张是大型GIF文件(3MP).
我正在查询MediaStore以检索相应的缩略图.如果我使用此sortOrder通过CursorLoader初始化Cursor:
MediaStore.Images.Media.DATE_ADDED + " DESC""
Run Code Online (Sandbox Code Playgroud)
会发生什么: MediaStore返回先前成功检索的缩略图:
预期的行为:当MediaStore由于某种原因无法检索给定图像的缩略图时,它必须返回NULL,根据其Javadoc:"...返回一个Bitmap实例.如果与origId关联的原始图像不是,则它可以为null存在或记忆不够."
如果我用这个sortOrder初始化Cursor:
MediaStore.Images.Media.DATE_ADDED + " ASC""
Run Code Online (Sandbox Code Playgroud)
它运行得很好:
但是我不能简单地改变sortOrder,因为要求是先显示最新的图片.
下面是我的示例代码,这里是完整的示例项目以及用于重现的三个图像.
package com.example.getimagefrommediastore;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.CursorLoader;
import android.widget.ImageView;
import android.widget.TextView;
public class GetThumbnailsFromMediaStoreSampleActivity extends Activity {
TextView mThumb_id_01;
TextView mThumb_id_02;
TextView mThumb_id_03;
ImageView mImg_01;
ImageView mImg_02;
ImageView mImg_03;
boolean isThumb01 = true; // Simple flag to control this example
boolean isThumb02 = true;
Cursor mCursorLoader;
int mColumnIndex;
long …Run Code Online (Sandbox Code Playgroud) 我试图AlphabetIndexer用这样的自定义适配器实现
我的类ContactsCursorAdapter扩展SimpleCursorAdapter和实现SectionIndexer
,我使用a LoaderManager来管理我的适配器的光标,所以我已经覆盖了swapCursor()方法,就像上面示例的第二个答案所示.
public class ContactsCursorAdapter extends SimpleCursorAdapter
implements SectionIndexer{
private LayoutInflater mInflater;
private Context mContext;
private AlphabetIndexer mAlphaIndexer;
public ContactsCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
mInflater = LayoutInflater.from(context);
mContext = context;
}
public View getView(final int position, View convertView, ViewGroup parent) {
...
}
@Override
public int getPositionForSection(int section) {
return mAlphaIndexer.getPositionForSection(section);
}
@Override
public int getSectionForPosition(int position) { …Run Code Online (Sandbox Code Playgroud) android adapter simplecursoradapter android-loadermanager android-cursorloader
我从一个交换ResourceCursorAdapter我曾经newView和bindView一个SimpleCursorAdapter在那里我只使用getView方法.
现在我有一个错误onLoaderFinished.虽然它给了我NullPointerException在adapter.swapCursor(cursor)我的两个适配器和光标对象是NOT NULL.我将在下面发布我的所有代码.非常感谢任何帮助(没有多余的头发留下来).
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.ResourceCursorAdapter;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
public class ContactSelect extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final int LOADER_ID = 1;
private MyAdapter …Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-listview android-cursorloader
我有一个ContentProvider,它有两个表1. OnlineContacts2 AllContacts.然后我有一个方法,我查询两个表并分别得到他们的结果cursors.然后使用并列出一个列表加入他们.将此列表传递给我,我正在填充我的.喜欢 :CursorJoinerContactsCustomAdapter extending BaseAdapterlistview
public static List<Contact> getContacts(Context context){
List<Contact> contactList = new ArrayList<Contact>();
// Getting First Cursor
String URL = xyz;
Uri baseUri1 = Uri.parse(URL);
String[] select = xyz;
String where =xyz;
Cursor cursor = context.getContentResolver().query(baseUri1, select, where, null, "pid");
// Getting 2nd Cursor
Uri baseUri = xyz;
String[] projection =xyz;
String selection =xyz;
String[] selectionArgs = null;
String sortOrder = xyz;
Cursor mCursor= context.getContentResolver().query(baseUri, …Run Code Online (Sandbox Code Playgroud) 要从数据库中获取数据,我CursorLoader在应用程序中使用.一旦onLoadFinished()回调方法调用app的逻辑,就将Cursor对象转换为List业务模型需求中的对象.如果有大量数据,那么转换(繁重操作)需要一些时间.这会降低UI线程的速度.我尝试Thread使用RxJava2传递Cursor对象在非UI中启动转换,但得到Exception:
Caused by: android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
Run Code Online (Sandbox Code Playgroud)
这是Fragment代码的一部分:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
QueryBuilder builder;
switch (id) {
case Constants.FIELDS_QUERY_TOKEN:
builder = QueryBuilderFacade.getFieldsQB(activity);
return new QueryCursorLoader(activity, builder);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor.getCount() > 0) {
getFieldsObservable(cursor) …Run Code Online (Sandbox Code Playgroud) android ×10
sqlite ×2
adapter ×1
cursor ×1
deprecated ×1
eclipse ×1
java ×1
mediastore ×1
rx-android ×1
rx-java ×1
uri ×1