我正在创建ContentProvider,它是另一个ContentProvider的代理(用于安全问题并允许访问完整应用程序的部分功能).
public class GFContactsProvider extends ContactsProvider implements
DatabaseConstants {
private Context mContext;
private ContentResolver mContentResolver;
@Override
public boolean onCreate() {
mContext = getContext();
mContentResolver = mContext.getContentResolver();
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor result = mContentResolver.query(ContactsContract.getContactsURI(Long.parseLong(address.get(1))), null, null, null, ContactsContract.ContactColumns.SHOW_NAME);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
从我的CP调用内部CP后,我发现意外的异常:
java.lang.UnsupportedOperationException: Only CrossProcessCursor cursors are supported across process for now
Run Code Online (Sandbox Code Playgroud)
例外涉及由CP包裹Cursor并将其传输包裹,外部CP不能再包装它,所以我在这里遇到问题.当我检查返回游标的类时,我收到了CursorWrapperInner.有没有办法在我的外部CP中打开游标(从这个CWI到常规Cursor)(但不是通过循环将所有数据传输到MatrixCursor - 这太费时了).
在对我之前的一个问题的回答中,有人表示Android类UriMatcher中存在一些固有的缺陷(缺乏一个更好的词).任何人都可以通过UriMatcher查明已知问题吗?我正在设计一个依赖于UriMatcher的内容提供程序来正确匹配我的Uris(而不是我猜错了).是否存在已知问题的解决方法?或者是否有更好的匹配Uris的策略?
例:
这是我的UriMatcher的代码设置
private static final int MEMBER_COLLECTION_URI = 1;
private static final int MEMBER_SINGLE_URI = 2;
private static final int SUBMATERIAL_COLLECTION_URI = 3;
private static final int SUBMATERIAL_SINGLE_URI = 4;
private static final int JOBNAME_COLLECTION_URI = 5;
private static final int JOBNAME_SINGLE_URI = 6;
private static final int ALL_MEMBERS_URI = 7;
private static final int ALL_SUBMATERIAL_URI = 8;
static
{
//return the job and fab for anything matching the provided jobName
// JobNames/jobName
uriMatcher.addURI(JobMetaData.AUTHORITY, "JobNames/*/",
JOBNAME_SINGLE_URI);
//return a collection …Run Code Online (Sandbox Code Playgroud) 我的清单中有一个ContentProvider,当我使用硬编码字符串完全定义它时,它可以工作.例如
<provider android:name="com.myprovider" android:authorities="com.myprovider"/>
Run Code Online (Sandbox Code Playgroud)
工作完美,但ContentProviders在一个被多个项目使用的库中,我不想要权限冲突,所以我尝试执行以下操作.
<provider android:name="com.myprovider" android:authorities="@string/myProviderAuthority">
Run Code Online (Sandbox Code Playgroud)
这样我就可以在单个strings.xml文件中定义所有权限,并且应用程序之间没有冲突,因为我应该能够使用每个应用程序资源覆盖系统来更改它们.
但是,当我尝试使用@string进行构建时,它似乎给了我一个格式错误的清单错误,并说"提供商没有INCUDE(是的,它说INCUDE)当局致敬"
我是否可以不使用资源字符串为当局致敬,每次我需要在两个位置维护常量时我感到恶心.我们的质量保证部门很难抓住权威冲突,我不希望事情变得不同步或者可能引起混淆.任何人都有任何想法为什么我的代码不工作?
我正在对Android Contacts ContentProvider进行查询.我需要一个Group By子句.在Gingerbread和Honeycomb中,我这样做是为了同时搜索电话号码和电子邮件:
(实际的WHERE子句要复杂得多,因为它包含类型检查.这是一种简化,但它会产生相同的结果)
String request = Phone.NUMBER + " LIKE ? OR " + Email.DATA + " LIKE ?";
String[] params = new String["%test%", "%test%"];
Cursor cursor = getContentResolver().query(
Data.CONTENT_URI,
new String[] { Data._ID, Data.RAW_CONTACT_ID },
request + ") GROUP BY (" + Data.RAW_CONTACT_ID,
params, "lower(" + Data.DISPLAY_NAME + ") ASC");
Run Code Online (Sandbox Code Playgroud)
注入')'完成WHERE子句并允许插入GROUP BY子句.
但是,在Ice Cream Sandwich中,似乎ContentProvider会检测到这一点,并添加正确数量的括号以防止我的注射.在单个游标查询中执行此操作的任何其他方式?
目前,我已经删除了GROUP BY,并添加了一个MatrixCursor来限制影响,但我宁愿拥有一个真正的游标:
MatrixCursor result = new MatrixCursor(new String[] { Data._ID, Data.RAW_CONTACT_ID });
Set<Long> seen = new HashSet<Long>();
while (cursor.moveToNext()) {
long …Run Code Online (Sandbox Code Playgroud) 所以我刚为我的应用程序实现了一个小部件.它通过我的数据从数据库中获取数据ContentProvider.我在清单中定义了自己的读/写权限,说明我使用它们(似乎没有什么区别),并在内容提供程序中要求它们:
<!-- Define my permissions for the provider -->
<permission
android:name="com.nononsenseapps.notepad.permissions.read"
android:description="@string/permission_read_desc"
android:label="@string/permission_read_label"
android:permissionGroup="android.permission-group.PERSONAL_INFO"
android:protectionLevel="normal" />
<permission
android:name="com.nononsenseapps.notepad.permissions.write"
android:description="@string/permission_write_desc"
android:label="@string/permission_write_label"
android:permissionGroup="android.permission-group.PERSONAL_INFO"
android:protectionLevel="normal" />
......
<uses-permission android:name="com.nononsenseapps.notepad.permissions.read" />
<uses-permission android:name="com.nononsenseapps.notepad.permissions.write" />
<uses-permission android:name="android.permission.BIND_REMOTEVIEWS" />
......
<provider
android:name=".NotePadProvider"
android:authorities="com.nononsenseapps.NotePad"
android:enabled="true"
android:exported="true"
android:label="@string/app_name"
android:readPermission="com.nononsenseapps.notepad.permissions.read"
android:syncable="true"
android:writePermission="com.nononsenseapps.notepad.permissions.write" >
<grant-uri-permission android:pathPattern=".*" />
</provider>
Run Code Online (Sandbox Code Playgroud)
我通过a更新我的小部件Service(根据小部件教程):
<!-- List Widget -->
<receiver android:name="com.nononsenseapps.notepad.widget.ListWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/listwidgetinfo" />
</receiver>
<service
android:name="com.nononsenseapps.notepad.widget.ListWidgetService"
android:exported="false"
android:permission="android.permission.BIND_REMOTEVIEWS" />
Run Code Online (Sandbox Code Playgroud)
而这Service反过来做到这一点(包括一堆代码):
/**
* …Run Code Online (Sandbox Code Playgroud) 我正在使用ContentProvider我的android应用程序在应用程序之间共享数据库.为了共享数据库,我需要添加提供者访问权限,AndroidManifest.xml如下所示:
<provider
android:name="Contentprovider"
android:authorities="umb.con.apps.vid" />
Run Code Online (Sandbox Code Playgroud)
我成功添加并实现了,但<provider/>标签中显示的警告消息如下所示"导出的内容提供商可以提供对潜在敏感数据的访问".它将来会引起任何安全问题吗?
有很多答案和教程使用InsertHelper在SQLiteDatabase中快速批量插入.
但是从API 17开始,不推荐使用InsertHelper.
什么是在Android SQLite中批量插入大量数据的最快方法?
到目前为止,我最关心的是SQLiteStatement使用起来不太舒服,其中InsertHelper具有绑定列和绑定值,这有点微不足道.
sqlite android bulkinsert android-contentprovider android-sqlite
我正在开发一个应用程序,我使用sqllite3数据库来存储值.我有Nexus S和Nexus 7都是无根设备.如何为我的应用程序获取数据库以进行调试.
我试过(1)我尝试过这里提到的所有方法
adb shell
run-as app.package.name \
cp /data/data/package.name/databases/application.sqlite /sdcard/
exit
adb pull /sdcard/application.sqlite ~/
Run Code Online (Sandbox Code Playgroud)
这说cp没找到..
(2)http://developer.android.com/tools/help/adb.html#sqlite
adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit
Run Code Online (Sandbox Code Playgroud) 内容提供程序/解析程序API提供了一种使用URI openInputStream()和openOutputStream()方法在进程之间传输数据的复杂但强大的方法.自定义内容提供商能够openFile()使用自定义代码覆盖该方法,以有效地将URI解析为Stream; 但是,方法签名openFile()具有ParcelFileDescriptor返回类型,并且不清楚如何为此方法返回动态生成的内容生成正确的表示.
是否有ContentProvider.openFile()现有代码库中动态内容实现方法的示例?如果没有,你可以建议这样做的源代码或过程吗?
我正在尝试让我的ContentResolver运行此查询:
select * from myTable limit 1 offset 2
Run Code Online (Sandbox Code Playgroud)
ContentResolver中唯一的查询方法是:
resolver.query(uri, projection, selection, selectionArgs, sortOrder);
Run Code Online (Sandbox Code Playgroud)
我试过了:
final Cursor c = resolver.query(
MyTable.CONTENT_URI,
MyTable.PROJECTION,
" ? ?",
new String[] {"1", "2"},
null);
Run Code Online (Sandbox Code Playgroud)
这只是抛出一个IllegaLArgumentException.实现这一目标的正确方法是什么?