- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在更新一个 Android 2.2 应用程序以使用 CursorLoader(使用 v4 兼容性库),我正在焦头烂额地试图理解为什么当内容提供者时 onLoadFinished
方法没有被调用通知与 CursorLoader 查询关联的内容发生变化。
CursorLoader 正在查询客户内容提供者。我的提供商在其查询方法中设置通知 URI:
cursor.setNotificationUri(getContext().getContentResolver(), uri);
并通知其插入/更新/删除方法的变化:
getContext().getContentResolver().notifyChange(uri, null);
我已经检查过这两种情况下的 URI 是否相同。以前我使用的是具有相同内容提供者的 ManagedQuery,查询的内容更新得很好,这让我认为内容提供者可能没问题。
我看过 LoaderCursorSupport例如,有趣的是,当我在我的 Nexus One 上运行它时,我没有看到它反射(reflect)了我对联系人姓名所做的更改(在示例应用程序和联系人应用程序之间切换)。应该是?如果是这样,是否存在一些我不知道的潜在问题?
最佳答案
我终于弄清楚了这件事,而且,就像往常一样,这对我来说是一个愚蠢的错误。我在我的 onLoadFinished() 方法中调用了 cursor.close() - 我使用返回的游标创建一个 ArrayAdapter(我需要在列表顶部手动插入一个项目)并且游标关闭是使用 ManagedQuery 的遗留物在迁移以使用 CursorLoader 之前。
在寻找这个的过程中,我创建了一个简单的测试类来显示书签列表并添加一个随机书签(使用选项菜单)。这按应有的方式工作,即在添加项目后调用 onLoadFinished() 。这是代码,以防对其他人有用:
package com.test;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Browser;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
public class CursorLoaderTestActivity extends FragmentActivity
{
private static final String TAG = CursorLoaderTestActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
// Create the list fragment and add it as our sole content.
if (fm.findFragmentById(android.R.id.content) == null)
{
CursorLoaderListFragment list = new CursorLoaderListFragment();
fm.beginTransaction().add(android.R.id.content, list).commit();
}
}
public static class CursorLoaderListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>
{
// This is the Adapter being used to display the list's data.
SimpleCursorAdapter mAdapter;
// If non-null, this is the current filter the user has provided.
String mCurFilter;
@Override public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
// Give some text to display if there is no data. In a real
// application this would come from a resource.
setEmptyText("No data");
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
// Create an empty adapter we will use to display the loaded data.
mAdapter = new SimpleCursorAdapter(getActivity(),
android.R.layout.simple_list_item_1, null,
new String[] { Browser.BookmarkColumns.TITLE },
new int[] { android.R.id.text1}, 0);
setListAdapter(mAdapter);
// Start out with a progress indicator.
setListShown(false);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getLoaderManager().initLoader(0, null, this);
}
//@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
// Place an action bar item for searching.
MenuItem item = menu.add("Add Item");
//item.setIcon(android.R.drawable.ic_menu_search);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
}
@Override
public boolean onOptionsItemSelected (MenuItem item)
{
ContentValues cv=new ContentValues();
cv.put(Browser.BookmarkColumns.TITLE, "!AA " + System.currentTimeMillis());
cv.put(Browser.BookmarkColumns.URL, "http://test/");
cv.put(Browser.BookmarkColumns.BOOKMARK, 1);
getActivity().getContentResolver().insert(Browser.BOOKMARKS_URI, cv);
return true;
}
//columns to query
static final String[] PROJECTION = new String[] { Browser.BookmarkColumns.TITLE };
public Loader<Cursor> onCreateLoader(int id, Bundle args)
{
Log.i(TAG, "onCreateLoader");
return new CursorLoader(getActivity(), Browser.BOOKMARKS_URI,
PROJECTION, null, null,
Browser.BookmarkColumns.TITLE + " ASC");
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data)
{
Log.i(TAG, "onLoadFinished");
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data);
// The list should now be shown.
if (isResumed())
setListShown(true);
else
setListShownNoAnimation(true);
}
public void onLoaderReset(Loader<Cursor> loader)
{
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
}
}
关于Android CursorLoader 不响应 ContentProvider 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919198/
我正在开发一个应用程序,我希望它同时适用于 Android 和 Blackberry(将来可能适用于 JavaME)。业务逻辑对所有平台都是通用的 - 因此,代码中的相应层也是如此。 但我也有一个数据
谁能告诉我如何创建一个 ContentProvider,它可以查询多个数据库/ContentProvider 以获得 SearchView 提供的搜索建议。 最佳答案 使用 ContentProvid
我想将一个通用的 POJO 放入 ContentValues 并在 ContentProvider 中解码。 我一直在绞尽脑汁:Parcelables、ContentValues 和插入 SQLite
我在 AsyncTask 中有一个 ContentProvider 访问权限,在手机上查找存储在 sqlite 中的一些数据时通常工作正常。 不过,我还有一些其他后台服务可以进行网络检查以及下载和更新
我正在尝试使用自定义 ContentProvider 提供游戏内高分。它将使用服务器连接而不是 SQLite 数据库。 现在,ContentProvider 的query()、update() 和de
Google 就 ContentProvider 中的路径遍历漏洞发出警告 https://support.google.com/faqs/answer/7496913 Implementations
我见过很多使用ContentProvider与sqlite数据库交互的例子。我在某处读到的文档说 ContentProvider 也能够与普通文件交互。但我们要怎么做呢?到目前为止,我找不到与此相关的
如何将搜索中的引号转义到 ContentProvider?像这样查询: String value = "O'Key" ;/ / string contains a quote Cursor peopl
我正在开发一个将数据存储在 SQLite 数据库中的内容提供程序。在开发过程中,我需要更改模式,或者完全删除数据库并重新构建它(在这个开发阶段我不会升级数据库)。 我找到了数据库文件,存储在/data
大家,我在看android源码。但是我找不到对我有值(value)的东西。实际上,我想知道ContentProvider是否像AIDL一样工作。你知道,AIDL可以实现两个独立应用程序之间的通信。 所
我正在尝试为我的应用程序编写一个内容提供程序,以允许访问我的应用程序存储在 SD 卡上的某些文件。文件的名称是其内容 URI 的哈希值,因此例如 content://my.app.files/test
有什么方法可以利用 ContentProvider 检查我的 Android 手机是否已连接到互联网? 谢谢 最佳答案 我想你想要ConnectivityManager .有一个例子 here . 这
是否可以在应用中初始化contentprovider? 因为我需要为每个用户/服务器组合创建一个数据库,并且我在内容提供者的 oncreate 方法中使用登录信息创建数据库! 最佳答案 根据听起来您正
仅当您需要在多个应用程序之间共享数据时才需要内容提供程序。 这是使用它的唯一目的吗?简单地从 WS 获取数据并将其写入 CP,然后在 Activity 中从这里读取怎么样? iosched呢? :这里
当我从ContentProvider 获取Cursor 对象时,那时我可以使用这个游标对象来检索所有数据。我的问题是: 游标是否包含里面的所有数据。这意味着系统已经查询并花费了时间来加载数据。 这只是
我有一些加密存储 (SQLite),想实现我自己的 ContentProvider。前提是: 只有在以下情况下才应授予/可能访问权限工作/启动我的应用程序 - 总而言之其他情况访问必须被拒绝返回给用户
我有一个 ContentProvider 子类来处理我所有的数据库工作,还有一个在后台运行的服务。 我似乎无法将服务绑定(bind)到 ContentProvider。我是否可以从 ContentPr
我有一个在 list 中声明的 ContentProvider,它是什么时候真正创建的?当应用程序启动时但在启动第一个 Activity 之前?当第一次查询/更新/插入完成时?什么时候? 最佳答案
我想实现一个操作多个表的ContentProvider。到目前为止,这是我尝试过的。我编写了一个 Java Interface,表示每个表都应在其 CRUD 类中实现的 CRUD 操作。 public
我制作了自己的 contentprovider,我通过多次插入将大量数据一次性放入其中。 该应用程序将从外部源接收数据,此时我收到大约 30 个项目(因此是插入的 30 倍)。 现在我注意到这需要很多
我是一名优秀的程序员,十分优秀!