Articles of contentprovider

如何从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(); […]

通过内容提供者传递二进制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中的资源而存在。

Android:听到像WhatsApp这样的联系人更改

我正在构build一个严重依赖用户联系人的应用程序。 我已经创build了一个Account并在需要时代表这个帐户创buildRawContacts 。 而且我使用SyncAdapter ,事情很好。 但是我仍然错过了这个难题的一些部分: 我试图实现类似于WhatsApp的行为。 这样 – 当任何联系人的姓名或电话发生变化时,将发送给服务器进行评估 。 无论此联系人是否已经在“我的” RawContacts ,他是否刚刚由用户创build。 我知道有ContentObserver但跟踪ContactsContract.Contacts.CONTENT_URI似乎是错误的事情要做,因为它没有给出具体的变化,再加上它被提升了很多次,并从许多事件不感兴趣。 我知道WhatsApp正在使用SyncAdapter,但我认为他们可能会做更多的事情。 任何想法将不胜感激。

Singleton与Android中Database Helper类的静态内部类

我正在尝试查看哪些这些实现更适合在Android应用程序中访问sqlite数据库 实施1 使用扩展SqliteOpenHelper和使用单例模式的DatabaseHelper类。 在一些罕见的情况下,我确实看到崩溃,因为数据库被closures。 虽然有些恼人,但是我让他们通过,只是因为它在事物的macros伟计划和我拥有的项目数量上都很小。 public class DBHelper extends SQLiteOpenHelper { private static DBHelper instance; private final String CREATE_HEALTH_DATA_TABLE = "CREATE TABLE IF NOT EXISTS my_table ( " + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + MT_FIELD_NAME + " TEXT NOT NULL );"; private DBHelper getInstance(Context c) { if (instance == […]

禁用ContentProvider URI上的通知

我正在寻找一种方法来暂停给定ContentProvider的Uri上的通知。 用例是: 一个Activity通过一个CursorLoader绑定到一个CursorAdapter 。 Service可能会在ContentProvider上执行大量的批量单行更新。 随着ContentProvider通过ContentResolver#notifyChange通知侦听器, CursorLoader将在每次行更新时重新加载其内容。 由于我无法编辑ContentProvider ,并且我无法控制批量查询的执行,所以有没有办法在Uri (在正在执行的Service )挂起通知,直到执行了所有ContentProviderpipe理的查询? 我需要这个以避免连续重新调用CursorLoader引起的闪烁。

Android Web浏览器主页

我已经看到了几个应用程序和广告networking,如startapp通过代码更改android网页浏览器主页。 这怎么可能? 我看了一下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的链接 任何帮助或想法,将不胜感激:)

Android Browser.BOOKMARKS_URI不适用于所有设备。 如何找出给定设备的正确uri?

我正尝试使用Android Browser.BOOKMARKS_URI从我的应用程序中删除设备书签( https://play.google.com/store/apps/details?id=com.elementique.web ) 它在大多数设备上工作正常,但在某些情况下不起作用:-( 在这些设备上,试图使用书签导致 java.lang.IllegalArgumentException: Unknown URL content://browser/bookmarks 我现在明白,Boookmark Uri可以不同于AOSP默认值(即“content:// browser / bookmarks”)。 题: 我怎样才能得到一个给定的设备正确的书签Uri ? 我已经“收集”了下面的URI private static final Uri BOKKMARKS_DEFAULT = Browser.BOOKMARKS_URI; // = Uri.parse("content://browser/bookmarks") private static final Uri BOKKMARKS_URI_CHROME = Uri.parse("content://com.android.chrome.browser/bookmarks"); private static final Uri BOKKMARKS_URI_SAMSUNG_S_ = Uri.parse("content://com.sec.android.app.sbrowser.browser/bookmarks"); 这是一种在设备上“列出”所有可用的内容URI(content:// …)的方法吗? 如果是的话,我可以列出它们并search“/书签”string的出现,并尝试使用这个URI。 注意 : 我目前正在创build一个回退机制,如果应用程序无法获得“工作”书签URI(即我自己的书签数据库,因为我需要在我的应用程序中的书签function)

getLoaderManager()的args参数的用途。initLoader(…,…,…)?

有没有人有使用initLoader()的Bundle args参数的描述? 该对象是否只是在结果光标上设置,或者有没有一种方法可以从被查询的数据源访问该对象 – 就像Content Provider? 从文档: args可选的参数在施工时提供给加载器。 如果一个加载器已经存在(不需要创build一个新加载器),这个参数将被忽略,最后一个参数继续被使用。 先谢谢你。

如何使用ContentObserver和RecyclerView?

有了ListView我们已经有了一个很好的本地模式来将一些数据从数据库映射到列表: DB – > ContentProvider – > CursorLoader – > CursorAdapter – > ListView 这种方法在数据层分离,性能和自动数据更新方面很好。 但是这种模式并不适合新的RecyclerView 。 有一些模仿旧行为的方法: 与数据库一起使用recyclerview 但是使用旧式的notifyDataSetChanged和RecyclerView有一个问题。 它不能使用ItemAnimatorfunction,它失去了滚动的位置,它只是无效的。 那么,在使用包装在ContentProvider数据库时,我们如何从细化的更改通知中受益呢? Cursor是静态的,为了从中获得新的数据,我们需要获得新的Cursor 。 所以,我们似乎需要一个自定义的中间数据层,它将合并来自Cursors的数据并将实体List展示给RecyclerView.Adapter 。 此外,我们将不得不手动将ContentObserver onChange()事件映射到RecyclerView通知。 这也意味着我们将不得不摆脱CursorLoader。 对于这样的基本任务来说,这是一个令人难以置信的数量。 有没有更好的解决scheme?