Articles of contentprovider

使用Android SimpleCursorAdapter和CursorLoader

我是Android新手,我试图让我的标题绕过SimpleCursorAdapter和CursorLoader类。 根据我的理解,我见过的所有示例都使用这两个类将数据加载到后台线程中的ListView中(不阻止UI)。 我对此很好,并且已经将这种通用方法与我自己的项目列表一起使用,但是我现在希望能够单击列表中的项目并获取该项目的完整信息。 通常的做法是使用SimpleCursorAdapter和CursorLoader来检索单个项目的详细信息吗? 或者它们只是用于列表? 谢谢。

android中共享首选项和内容提供者之间的区别

我部分了解共享偏好和意图。但我想知道什么是Android中的共享首选项和内容提供程序? 此外,意图,共享偏好和内容提供商之间的基本区别是什么 。 请解释一下这个。

内容观察者的onChange方法触发了多次

我知道你很想把它标记为重复但等等,让我再次通过我的详细(但失败)尝试再次讨论这个问题。 策略1:算法: 答案 第一次触发onChange时,更新行的id 下次再次触发onChange时,会更新行的id 匹配id 忽略相同的id 这种方法的问题在于它很容易受到竞争条件的影响 。 如果在获得更新行的id时,onChange 第二次触发,则此算法失败。 这源于我在慢速机器或以峰值容量工作的 机器上进行测试时的个人经验。 策略2:算法: 答案 覆盖deliverSelfNotifications()以返回true。 这开始看起来很有希望,但没有奏效。 我用来参考的代码: 在主要活动:OnCreate方法我注册: getContentResolver().registerContentObserver(Uri.parse(“content://sms”), true, new CtObserver(new Handler())); 然后在一个单独的类中: package com.example.testproject; import android.database.ContentObserver; import android.os.Handler; import android.util.Log; /** * @author Time Traveller */ public class CtObserver extends ContentObserver { public CtObserver(Handler handler) { super(handler); } public boolean deliverSelfNotifications(){ return […]

Android Web浏览器主页

我已经看到几个应用程序和广告网络,如startapp通过代码更改Android Web浏览器主页。 这怎么可能? 我已经看了一下startapp sdk,但我还没有设法find他们更改主页的部分。 我还看了com.android.browser.BrowserSettings中的BrowserSettings 在BrowserSettings ,有一个名为setHomepage(Context, String)的接口。 public void setHomePage(Context context, String url) { Editor ed = PreferenceManager. getDefaultSharedPreferences(context).edit(); ed.putString(PREF_HOMEPAGE, url); ed.commit(); homeUrl = url; } 我不知道很多java / android,所以如果我错了就纠正我: setHomepage()没有声明为静态,因此无法从其他活动中调用它。 所以我不能用这个。 我看不到任何模式应用于共享首选项,所以这意味着它将默认采取私有模式,我不能编辑共享首选项或? 有些人说可能会使用contentProvider / Resolver。 BrowserSettings.java的链接 任何帮助或想法将不胜感激:)

通过内容提供程序传递二进制blob

我有一个内容提供程序,它是我的Android应用程序集自定义的,它需要公开的一个东西是一个小的(20-30 KiB)字节数组。 这些blob的URI如下所示: content://my.authority/blob/# 其中#是行号; 生成的游标具有标准的_id列和数据列。 我在提供程序的query()方法中使用MatrixCursor : byte[] byteData = getMyByteData(); MatrixCursor mc = new MatrixCursor(COLUMNS); mc.addRow(new Object[] { id, byteData }); 后来,在使用数据的应用程序中,我这样做: Cursor c = managedQuery(uri, null, null, null, null); c.moveToFirst(); byte[] data = c.getBlob(c.getColumnIndexOrThrow(“data”)); 但是,数据不包含原始字节数组的内容; 相反,它包含类似[B@435cc518东西,它看起来更像是数组的地址而不是内容。 我尝试在java.sql.Blob的实现中包装字节数组,认为它可能正在寻找,因为内容提供者子系统被编写为易于与SQLite一起使用,但它没有帮助。 有没有人得到这个工作? 如果数据在文件系统中,我可以使用ContentProvider中的方法向客户端提供编组的InputStream ,但是我尝试发送的数据作为内容提供商的APK中的资源存在。

如何在RecyclerView中使用ContentObserver?

使用ListView我们有一个很好的本机模式来将一些数据从db映射到列表: DB – > ContentProvider – > CursorLoader – > CursorAdapter – > ListView 这种方法在数据层分离,性能和自动数据更新方面表现良好。 但这种模式并不适合新的RecyclerView 。 有一些模仿旧行为的方法: 将recyclelerview与数据库一起使用 但是使用旧样式notifyDataSetChanged与RecyclerView存在问题。 它不能使用ItemAnimatorfunction,它会失去滚动位置,而且它只是无效。 那么,在使用包含在ContentProvider数据库时,我们如何从精细的变更通知中受益? Cursor是静态的,要从中获取新数据,我们需要获得新的Cursor 。 因此,似乎我们需要一个自定义中间数据层,它将合并来自Cursors的数据并将实体List公开给RecyclerView.Adapter 。 此外,我们必须手动将ContentObserver onChange()事件映射到RecyclerView通知。 这也意味着我们必须摆脱CursorLoader。 对于这样的基本任务来说,这是一项令人难以置信的工作。 有没有更好的解决方案?

如何创建Cursor数据而不从Android应用程序中的DataBase获取数据?

在我的Android应用程序中,我使用Sqlite DataBase来存储来自服务器的数据。 我使用ContentProvider和ContentResolver访问DataBase中的数据,并使用CursorAdapter将数据绑定到ListView。 数据插入DataBase后,将通知CursorAdapter更新ListView。 此外,每当我滚动ListView时,我都会从DataBase表中获取新数据,并且ListView将被更新。 但是一旦到达表行的末尾,我需要直接从服务器获取数据而不存储到DataBase中并在ListView中更新它。 现在,当我使用接受Cursor数据的CursorAdapter时,如何绑定一个不是来自DataBase的新数据集? 是否可以创建Cursor数据而无需从DataBase获取数据并使用ContentProvider中的ChangeCursor()方法来更新ListView? 如果没有,是否还有其他方法可以实现相同的目标?

除了过早调用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。 有人遇到过这个问题吗?