Articles of contentprovider

除了过早调用cursor.close()之外,什么可能导致StaleDataException?

我目前正在大量修改/重写一个Android应用程序,我看到一个非常偶然的崩溃沿着以下几行:调用CursorAdapter方法,它调用AbstractWindowedCursor#checkPosition() ,和: 02-20 15:03:18.180 E/AndroidRuntime(17143): android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method. 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139) 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74) 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.CursorWrapper.getLong(CursorWrapper.java:106) 02-20 15:03:18.180 E/AndroidRuntime(17143): at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220) 麻烦的是,我们没有关闭任何Cursor 。 我们所有的Cursor都来自CursorLoader而且是由ContentProvider生成的。 我们将Cursor从LoaderCallbacks传递到每个相应的CursorAdapter ,我们在ContentProvider注册Cursor用于通知,我们从每个insert(…) , delete(…)和update(…) 通知) ContentResolver update(…) …简而言之,我找不到任何理由为什么Cursor在使用时会关闭。 那么: StaleDataException的其他原因是StaleDataException […]

什么是Android中已弃用的MODE_WORLD_READABLE SharedPreferences的替代品?

我正在开发Android应用程序A以便另一个B可以读取A的SharedPreferences 。 在javadoc for android.content.Context ,以下是关于MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE : 在API级别17中不推荐使用此常量。创建世界可写文件非常危险,并且可能会在应用程序中造成安全漏洞。 强烈劝阻; 相反,应用程序应该使用更正式的交互机制,例如ContentProvider , BroadcastReceiver和Service 。 据此, A应使用MODE_PRIVATE标志保存其SharedPreferences并提供ContentProvider ,以便B可以查询A的ContentProvider 。 但我怎么知道SharedPreferences Uri? 我想这就像content://authority_name/preference_file_name但这对我不起作用。 我要感谢任何正确的例子。 一般来说,是否可以访问其他应用程序的MODE_PRIVATE SharedPreferences ?

AccountManager不会在Android N预览中添加自定义帐户

我在我的应用中实现了同步适配器,需要在设备帐户设置中添加帐户。 我遵循Android文档中给出的相同方法。 它工作正常,直到棉花糖,我可以看到我的帐户在设备帐户中列出。 但在Android N预览中,帐户不会添加到设备帐户。 AccountManager的addAccountExplicitly()方法始终返回false。 有人遇到过这个问题吗?

在自定义内容提供程序中调用delete方法

我正在学习Android,而且我遇到了一个涉及调用自定义内容提供商的问题。 我一直在教学书中使用一个例子,虽然它描述了如何创建自定义提供者,但没有明确的例子如何调用其中的特定方法。 我特别研究如何从自定义内容提供程序中删除单个记录。 以下是自定义内容提供程序( EarthquakeProvider.java )的代码: @Override public int delete(Uri uri, String where, String[] whereArgs) { int count; switch (uriMatcher.match(uri)) { case QUAKES: count = earthquakeDB.delete(EARTHQUAKE_TABLE, where, whereArgs); break; case QUAKE_ID: String segment = uri.getPathSegments().get(1); count = earthquakeDB.delete(EARTHQUAKE_TABLE, KEY_ID + “=” + segment + (!TextUtils.isEmpty(where) ? ” AND (” + where + ‘)’ : “”), […]

使用Ormlite与Android的内容提供商合作

我正在开发一个Android应用程序,我对是否应该使用Ormlite与Android内容提供程序一起更新和检索数据感到矛盾。 内容提供程序将主要用于通知应用程序其他平台上应用程序中发生的数据更改。 也许我让它变得比它需要的更复杂。 一些更有经验的意见将不胜感激!

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

谷歌文档指出不要使用CursorAdapters第一个构造函数, CursorAdapter(Context context, Cursor c) 只有两个选项, CursorAdapter(Context context, Cursor c, boolean autoRequery) 这说 允许控制自动重新查询的构造函数。 建议你不要使用它,而是使用CursorAdapter(Context,Cursor,int)。 使用此构造函数时,将始终设置FLAG_REGISTER_CONTENT_OBSERVER 和 CursorAdapter(Context context, Cursor c, int flags)` 这说它是推荐的构造函数。 问题是这里只有两个标志用于最后一个构造函数, 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(Context context, Cursor c, int flags)以使其与我的CursorAdapter一起正常工作? 让我担心的是如何正确管理旧光标。 我不确定这样做的正确方法。 如果我使用FLAG_REGISTER_CONTENT_OBSERVER ,那么我必须对onContentChanged()做一些事情,但是当我在LoaderManager使用swapCursor()时,由于光标没有关闭,我只能做adapter.swapCursor(cursor).close() 。 但是这会与CursorAdapter onContentChanged()冲突吗? 目标是不会导致任何内存泄漏并且效率很高。

当为给定的URI调用ContentResolver.notifyChange()时,ContentObservers是否会通知此URI的后代URI?

一个有希望直截了当的问题:当为给定的URI调用ContentResolver.notifyChange() , ContentObserver是否ContentObserver通知此URI的后代 URI? 例如,假设我有一个游标设置来观察特定资源的URI: Uri uriA = Uri.parse(“content://” + AUTHORITY + “/orders/21”); cursor.setNotificationUri(getContext().getContentResolver(), uriA); 然后我通知ContentResolver对此URI的祖先进行更改(例如,因为我删除了所有订单): Uri uriB = Uri.parse(“content://” + AUTHORITY + “/orders”); getContext().getContentResolver().notifyChange(uriB, null); 我的Cursor ,注册观察uriA ,会被通知吗?

带有LoaderManager的CursorLoader如何知道将光标发送到CursorAdapter?

我正在浏览一些代码,并且我意识到我实际上并不知道CursorLoader和LoaderManager组合如何与CursorAdapter连接使用。 这是我困惑的部分。 agendaAdapter = new MyAgendaAdapter(this, null); makeProviderBundle(new String[] {“_id”, “event_name”, “start_date”, “start_time”, “end_date”, “end_time”, “location”}, “date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null); getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this); list.setAdapter(agendaAdapter); 那么我的自定义ContentProvider的query()方法如何知道将它发送到特定的CursorAdapter ? 我只是没有看到连接。 我理解其他一切,但这个问题是什么。 哦,我应该提一下,代码运行正常。

如何从CursorLoader刷新光标?

所以我有我的MainDisplayActivity ,它实现了Activity和LoaderManager.LoaderCallbacks 。 在这里,我有一个ListView ,我填写了我使用ContentProvider从我的数据库获得的议程信息。 我还有一个GridView ,它是一个日历。 我点击一个单元格时设置了它,在点击的那一天更新议程。 我的问题是,当重用我在setOnItemClickListener()内部的onCreate()创建的Loader时,它不会使用我正在创建的新游标刷新信息。 我可以用另一个ID创建一个新的Loader,它可以工作一次,但是一旦我点击另一天,它就会停止刷新。 问题在于光标。 如何从Loader刷新游标,这样我就不必继续创建新的Loader? 提前致谢! 初始调用在My MainDisplayActivity类的onCreate()中创建Loader: makeProviderBundle(new String[] {“_id, event_name, start_date, start_time, end_date, end_time, location”}, “date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null); getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this); list.setAdapter(agendaAdapter); 这些是来自LoaderCallbacks的重写方法 @Override public Loader onCreateLoader(int id, Bundle args) { Uri baseUri = SmartCalProvider.CONTENT_URI; return new CursorLoader(this, […]

如何使用Dagger为活动和碎片以外的东西设置dependency injection?

我开始使用Dagger设置dependency injection,如下所示。 因为我可能有错误,所以请鼓励我更正我的实施! 该实现遵循项目提供的android-simple示例 。 在下文中,您可以看到我是如何成功为Activities和Fragments添加dependency injection的。 我现在试着保持简单,所以我决定将Timber注入Android的log util的记录器替换。 import android.app.Application; import java.util.Arrays; import java.util.List; import dagger.ObjectGraph; import com.example.debugging.LoggingModule; public class ExampleApplication extends Application { private ObjectGraph mObjectGraph; protected List getModules() { return Arrays.asList( new AndroidModule(this), new ExampleModule(), new LoggingModule() ); } private void createObjectGraphIfNeeded() { if (mObjectGraph == null) { Object[] modules = getModules().toArray(); […]