标签: android-cursorloader

CursorLoader,获取本地数据库的URI

我是一个新手Android程序员,我最近跟着一个教程,该教程展示了如何创建一个本地SQLite数据库,然后使用SQLiteDatabase.rawQuery来返回一个Cursor来访问数据库.我想修改我的应用程序以使用CursorLoader,这显然是访问数据库的更好方法.我的问题是CursorLoader构造函数需要给出一个URI.我只输入"file:/// [db to path]"?似乎有点凌乱.

sqlite android uri android-cursorloader

14
推荐指数
1
解决办法
9434
查看次数

如何设置CursorAdapter(Context context,Cursor c,int flags)以使其与CursorLoader一起使用?

谷歌文档指出不使用第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

13
推荐指数
1
解决办法
7357
查看次数

LoaderManager做什么?

我试图了解loadermanager做了什么.任何人都可以与它共享一个例子吗?我创建游标时必须使用它们吗?如果不是我应该如何使用?非常感谢一个简单的例子.

android android-cursor android-loadermanager android-cursorloader

12
推荐指数
1
解决办法
5756
查看次数

Android eclipse startManagingCursor已弃用但想支持较旧的API版本?

我想了解一些事情,我相信这对某些人来说是非常基本的.

我到处读到不推荐使用startManagingCursor方法,你应该使用CursorLoader类.但这是否意味着即使对于支持API级别<11的应用程序,您也应该使用CursorLoader类?或者它是说如果你打算只支持Honeycomb,那么那么使用cursorLoader?

我似乎无法使用api 4导入游标加载器类,所以我假设使用CursorLoader在Android 3.0+之前不适用,但有人可以为我验证吗?

谢谢

eclipse android cursor deprecated android-cursorloader

12
推荐指数
1
解决办法
1万
查看次数

如何使用ContentProvider的insert()方法通过CursorLoader将值正确插入到SQLite数据库中?

我正在阅读文档,但我仍然不太确定.它说要使用getContentResolver(),但那时确实没有使用CursorLoader.那么有办法实现CursorLoader吗?我知道如何做到这一点query().步骤非常相似吗?即使只是一个可以解释这一点的链接也会有所帮助.

请注意,请勿将我链接到Google文档,因为他们没有使用insert()ContentProvider使用方法的示例CursorLoader.

提前致谢!!

编辑:我应该提到我与此混淆的原因是因为调用一个新的CursorLoader自动调用ContentProviders query()方法.但是如何才能为插入做同样的事情呢?

android android-contentresolver android-contentprovider android-loadermanager android-cursorloader

12
推荐指数
1
解决办法
2万
查看次数

MediaStore.Images.Thumbnails.getThumbnail返回错误的缩略图而不是NULL

考虑如下图所示的场景:

本土Galery

三张照片,其中一张是大型GIF文件(3MP).

我正在查询MediaStore以检索相应的缩略图.如果我使用此sortOrder通过CursorLoader初始化Cursor:

MediaStore.Images.Media.DATE_ADDED + " DESC""
Run Code Online (Sandbox Code Playgroud)

会发生什么: MediaStore返回先前成功检索的缩略图:

DESC

预期的行为:当MediaStore由于某种原因无法检索给定图像的缩略图时,它必须返回NULL,根据其Javadoc:"...返回一个Bitmap实例.如果与origId关联的原始图像不是,则它可以为null存在或记忆不够."

如果我用这个sortOrder初始化Cursor:

MediaStore.Images.Media.DATE_ADDED + " ASC""
Run Code Online (Sandbox Code Playgroud)

它运行得很好:

ASC

但是我不能简单地改变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)

java android mediastore android-cursor android-cursorloader

12
推荐指数
1
解决办法
4923
查看次数

带有由LoaderManager管理的自定义适配器的AlphabetIndexer

我试图AlphabetIndexer用这样的自定义适配器实现

带自定义适配器的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

11
推荐指数
1
解决办法
1万
查看次数

使用SimpleCursorAdapter在onLoaderFinished中使用NullPointerException

我从一个交换ResourceCursorAdapter我曾经newViewbindView一个SimpleCursorAdapter在那里我只使用getView方法.

现在我有一个错误onLoaderFinished.虽然它给了我NullPointerExceptionadapter.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

11
推荐指数
1
解决办法
2252
查看次数

如何在android中的LoaderManager中使用两个Cursors和CursorJoiner

我有一个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)

android android-loadermanager android-cursorloader

11
推荐指数
1
解决办法
5366
查看次数

CursorLoader的onLoadFinished回调中的RxJava2

要从数据库中获取数据,我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)

sqlite android android-cursorloader rx-java rx-android

11
推荐指数
2
解决办法
650
查看次数