Articles of android contentprovider

如何使用FLAG_GRANT_READ_URI_PERMISSION授予对自定义内容提供程序的临时访问权限

我试图从另一个应用程序(应用程序B)查询自定义内容提供程序(应用程序A)。 当内容提供商没有权限保护时,我可以这样做。 具体来说,我在App A上构建自定义内容提供程序,并将包含URI的intent发送到App B.这是App A中的intent-sending部分。 class InsertOnClickListener implements OnClickListener{ public void onClick(View v) { ContentValues values = new ContentValues(); values.put(DataBaseConfiguation.TableConfiguation.USER_NAME, “Jack”); Uri uri = getContentResolver().insert(DataBaseConfiguation.TableConfiguation.CONTENT_URI, values); System.out.println(“uri——————->” + uri); // the uri above should be like “content://com.catking.contentprovider.MyContentProvider/user” Uri uri2 = Uri.parse(“content://com.catking.contentprovider.MyContentProvider/user”); Cursor c = managedQuery(uri2, null, null, null, null); String sendvalue = null; if […]

内容提供程序中的Android自定义方法获取表中的记录数?

我有一个访问我的数据库的内容提供程序,如果你需要处理记录集,这很好,但我需要一个方法来返回一个表示表中记录数的整数 该方法看起来像这样 public long getRecordCount(String TableName) { SQLiteDatabase mDatabase = mOpenHelper.getReadableDatabase(); String sql = “SELECT COUNT(*) FROM ” + TableName; SQLiteStatement statement = mDatabase.compileStatement(sql); long count = statement.simpleQueryForLong(); return count; } 但我无法在内容提供商中find任何使用此方法(或任何其他不返回光标的方法),那么放置此方法的最佳位置以及如何调用它? 显然,我可以选择使用托管查询选择所有记录并使用cursor.count结果,这是一个非常糟糕的选择,但这是处理这个特定需求的一种非常低效的方法 谢谢

在Android应用程序中,每个表应该有一个内容提供程序,还是整个应用程序只有一个?

我有多年的Microsoft .NET开发经验(主要是C#),并且一直在努力提高Android和Java的速度。 到目前为止,我已经构建了一个带有几个屏幕和一个工作内容提供商的小应用程序。 我在开发内容提供程序时看到的所有示例通常都使用单个表,因此我得到的印象是这是惯例。 我为其他表构建了几个内容提供程序,当我尝试测试它们时遇到了“Unknown URI”IllegalArgumentException。 我的一个内容提供商正在抛出exception,但不是我打算调用的那个。 我的应用程序似乎正在使用AndroidManifest.xml文件中的第一个内容提供程序,现在让我想知道我是否应该只为整个应用程序提供单个内容提供程序。 在Android应用程序中使用多个表是否有最佳实践和/或示例? 我应该每个表有一个内容提供者还是整个应用程序只有一个? 如果是前者,如何将URI解析为适当的提供者? 如果是后者,如何防止我的内容提供者代码被switch语句污染?

ContentResolver.query(…)中的selectionArgs可以是子查询吗?

我在Android上使用SQLite。 我使用ContentProvider从db查询数据。 现在,尝试通过ContentResolver使用子查询时遇到问题 String selection = “cat_id NOT IN ?” String[] selectionArgs = new String[]{“(SELECT Categories.id FROM Categories)”} cursor = mResolver.query(getContentUri(), getListColumns(), selection, selectionArgs, orderBy); 这是错误: 08-06 10:32:36.070: E/AndroidRuntime(2151): Caused by: android.database.sqlite.SQLiteException: near “?”: syntax error (code 1): , while compiling: SELECT * FROM TRANSACTIONS WHERE cat_id NOT IN ? ORDER BY time_created ASC, id […]

如何获取所有联系人姓名,姓氏,电子邮件,电话号码等,无需重复

我正在尝试使用以下代码获取手机通讯录中所有联系人的详细信息。 但面临重复值的小问题。 EDITED 实际代码开头: – private String refreshData() { String emaildata = “”; try { ContentResolver cr = getBaseContext().getContentResolver(); String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + ” = ‘” + (“1”) + “‘”; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + ” COLLATE LOCALIZED ASC”; Cursor cur = cr .query(ContactsContract.Contacts.CONTENT_URI, null, selection + ” AND ” + ContactsContract.Contacts.HAS_PHONE_NUMBER + “=1”, […]

数据库更改后ContentLoader未正确刷新

我有一个SQLiteDatabase,其数据由Content Provider管理。 我正在使用标签式布局。 第一个选项卡具有向数据库添加行的function,而第二个选项卡显示数据库中的项目。 当我从第一个选项卡向数据库添加项目时,当我移动到另一个选项卡时, 应该反映更改。 数据正在正确地添加到数据库中,并且在首次打开应用程序时,将显示所有当前数据(以及在应用程序的先前版本中添加的任何新内容)。 但是,在ListFragment中不会反映向数据库中添加新项目。 @Override public void onClick(View v) { if(v == addSale) { Item item = new Item(rn(), null, 100); data.add(item); total += item.getAmount(); } else if(v == save) { for(Item i: data) { ContentValues cv = new ContentValues(); cv.put(DatabaseProvider.COLUMN_COST, i.getAmount()); cv.put(DatabaseProvider.COLUMN_ITEM, i.getItem()); cv.put(DatabaseProvider.COLUMN_PERSON, i.getPerson()); this.getActivity().getContentResolver().insert(DatabaseProvider.CONTENT_URI, cv); } total = […]

Android – 在contentProvider中选择最大值

我尝试在我的自定义内容提供者上运行此查询。 cursor = activity.getContentResolver().query( GoalDescriptor.CONTENT_URI, “max(priority)”, null, null, null); 获取优先级int列的最大值。 我也尝试过: cursor = activity.getContentResolver().query( GoalDescriptor.CONTENT_URI, null, “max(priority)”, null, null); 没有成功。 此代码返回此exception: java.lang.IllegalArgumentException: Invalid column MAX(priority) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:523) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:370) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:323) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:280) E/DatabaseUtils( 688): at nan.salsa.contentprovider.goal.GoalContentProvider.query(GoalContentProvider.java:118) E/DatabaseUtils( 688): at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:150) E/DatabaseUtils( 688): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111) E/DatabaseUtils( 688): […]

麻烦编写内部内存android

void launchImageCapture(Activity context) { Uri imageFileUri = context.getContentResolver() .insert(Media.INTERNAL_CONTENT_URI, new ContentValues()); m_queue.add(imageFileUri); Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); context.startActivityForResult(i, ImportActivity.CAMERA_REQUEST); } 以上代码一直有效,现在在insert()中为我生成了这个例外。 java.lang.UnsupportedOperationException: Writing to internal storage is not supported. at com.android.providers.media.MediaProvider.generateFileName(MediaProvider.java:2336) at com.android.providers.media.MediaProvider.ensureFile(MediaProvider.java:1851) at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:2006) at com.android.providers.media.MediaProvider.insert(MediaProvider.java:1974) at android.content.ContentProvider$Transport.insert(ContentProvider.java:150) at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:140) at android.os.Binder.execTransact(Binder.java:287) at dalvik.system.NativeStart.run(Native Method) 这不是一个空间问题,我唯一改变的是一个不相关的类的包。 另外,我重新启动了手机。

Android内容提供商更新某些列

我正在尝试制作一个Android应用程序,它将确定完成任务需要多少时间。 我遵循了Vogella的教程,特别是这部分http://www.vogella.com/articles/AndroidSQLite/article.html#todo来制作内容提供者和数据库。 它使用两个东西填充列表视图,即任务的名称和剩余的天数(后者是在用户在另一个活动中选择其结束日期时计算的)。 我的应用程序计算当前日期并从结束日期中减去它并存储数据库中剩余的天数。 问题是这只存储一次。 从现在开始的三天,它仍然会说还剩4天。 我希望应用程序检查每次客户端启动它时剩余的天数(检查当前日期,从结束日期减去并更新数据库中的该列)。 问题是我不知道该怎么做。 如果有人能给我一些指导,我会很感激。

ContentProvider中的访问上下文

我有一个ContentProvider类和一个DatabaseHelper类(扩展了SQLiteOpenHelper)。 ContentProvider实例化需要访问Context的Helper,因为构造函数需要它: public DBHelper(Context context, AssetFileDescriptor db_asset) { super(context, DB_NAME, null, 1); 您是否知道从ContentProvider获取Context的至少一种方法? 谢谢 :)