问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android数据库sql跟contentprovider什么作用

发布网友 发布时间:2022-04-08 09:42

我来回答

1个回答

热心网友 时间:2022-04-08 11:11

1.适用场景
1) ContentProvider为存储和读取数据提供了统一的接口
2) 使用ContentProvider,应用程序可以实现数据共享
3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)
2.相关概念介绍
1)ContentProvider简介
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
2)Uri类简介
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
在Content Provider中使用的查询字符串有别于标准的SQL查询。很多诸如select, add, delete, modify等操作我们都使用一种特殊的URI来进行,这种URI由3个部分组成, “content://”, 代表数据的路径,和一个可选的标识数据的ID。以下是一些示例URI:
content://media/internal/images 这个URI将返回设备上存储的所有图片
content://contacts/people/ 这个URI将返回设备上的所有联系人信息
content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)
  尽管这种查询字符串格式很常见,但是它看起来还是有点令人迷惑。为此,Android提供一系列的帮助类(在android.provider包下),里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让我们理解一点,因此,如上面content://contacts/people/45这个URI就可以写成如下形式:
  Uri person = ContentUris.withAppendedId(People.CONTENT_URI, 45);
然后执行数据查询:
Cursor cur = managedQuery(person, null, null, null);
这个查询返回一个包含所有数据字段的游标,我们可以通过迭代这个游标来获取所有的数据:

package com.wissen.testApp;
public class ContentProviderDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
displayRecords();
}

private void displayRecords() {
//该数组中包含了所有要返回的字段
String columns[] = new String[] { People.NAME, People.NUMBER };
Uri mContacts = People.CONTENT_URI;
Cursor cur = managedQuery(
mContacts,
columns, // 要返回的数据字段
  null, // WHERE子句
  null, // WHERE 子句的参数
   null // Order-by子句
);
if (cur.moveToFirst()) {
String name = null;
String phoneNo = null;
do {
// 获取字段的值
   name = cur.getString(cur.getColumnIndex(People.NAME));
phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER));
Toast.makeText(this, name + ” ” + phoneNo, Toast.LENGTH_LONG).show();
} while (cur.moveToNext());
}
}
}

  上例示范了一个如何依次读取联系人信息表中的指定数据列name和number。
修改记录:
我们可以使用ContentResolver.update()方法来修改数据,我们来写一个修改数据的方法:
private void updateRecord(int recNo, String name) {
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recNo);
ContentValues values = new ContentValues();
values.put(People.NAME, name);
getContentResolver().update(uri, values, null, null);
}
现在你可以调用上面的方法来更新指定记录:
updateRecord(10, ”XYZ”); //更改第10条记录的name字段值为“XYZ”
添加记录:
要增加记录,我们可以调用ContentResolver.insert()方法,该方法接受一个要增加的记录的目标URI,以及一个包含了新记录值的Map对象,调用后的返回值是新记录的URI,包含记录号。
上面的例子中我们都是基于联系人信息簿这个标准的Content Provider,现在我们继续来创建一个insertRecord() 方法以对联系人信息簿中进行数据的添加:

private void insertRecords(String name, String phoneNo) {
ContentValues values = new ContentValues();
values.put(People.NAME, name);
Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
Log.d(”ANDROID”, uri.toString());
Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE);
values.put(People.NUMBER, phoneNo);
getContentResolver().insert(numberUri, values);
}

这样我们就可以调用insertRecords(name, phoneNo)的方式来向联系人信息簿中添加联系人姓名和电话号码。

删除记录:
Content Provider中的getContextResolver.delete()方法可以用来删除记录,下面的记录用来删除设备上所有的联系人信息:
private void deleteRecords() {
Uri uri = People.CONTENT_URI;
getContentResolver().delete(uri, null, null);
}
你也可以指定WHERE条件语句来删除特定的记录:
getContentResolver().delete(uri, “NAME=” + “‘XYZ XYZ’”, null);
这将会删除name为‘XYZ XYZ’的记录。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机为啥投屏不到电视上 投屏到电视机上为什么不行了呢? 什么是超买状态,如何看出—个股票处于超买状态了? 用电脑怎么弄表格在电脑上制作表格怎么制作 ...明细帐、财务报表,带公式,EXCELE格式的文件,能发给我吗谢_百度... 电脑出入库表格怎么做作为一个仓管员excel表格如何做出入库存库存电脑会... 你好,可以发下库存管理的EXCEL表格么?衣服面料辅料都要统计,谢谢!麻烦... 电脑怎么制作电子表格如何用电脑制作表格 你好,能给我发一份出纳excel 做账模板现金流水账表格 芝麻香鸡有什么值得推荐的做法? 工商联络员登陆,信息添加完,显示登陆信息失败是什么原因? 描写榴莲的句子 赞美"榴莲"的句子有哪些? 核小肉多的榴莲怎么发朋友圈 男朋友给我买大大的榴莲想发朋友圈该说什么? 格力I酷空调出现'清洗'后一直闪烁,点击无反应然后消失无法清洗。请问是怎么回事? 谁提供个ARC平台或者游聚97拳皇一键必杀脚本 跪求《律师本色》97年开播的美剧,它第四季及以后的中文字幕啊,我最近迷上该剧,可惜英语不好,谢谢。 格力空调清洗后内机不启动是怎么回事,线路没动 ,拳皇97二阶堂红丸怎么接大招啊,有简化吗,怎么轻拳轻腿都特难练上呢,是不是像小草那样的连大招都有简化 请回答1997里面有一集两个粉丝后援会争吵的时候的背景音乐 【拳皇97】我在游戏厅玩过,就是和风云再起一样,不过可以选择同样的人,也就是说选大蛇的话可以选3个大蛇 有谁认识大连理工(97年入学)的李璐(1978,女,抚顺人)? OPPOa3手机的全面屏怎么设置?前几天更新了,自动给我设置了,我设置回来了又忘记怎么设置了~ 怎么关闭oppoa32阅屏? oppoa32触屏小圆圈如何关闭 Android开发 请哪位高手能帮我写一段代码: 星巴克会员卡忘了带,但是手机里有app,上面有我所有的信息和优惠券,请问在没有会员卡的情况下能不能 在日本弄丢了钱包怎么办!飞机就要起飞了啊!!! 去星巴克,喝完,吃完需要自己把垃圾扔掉吗 耳朵的英文是什么? 耳朵的英语单词怎么读 耳朵的英文怎么念 “耳朵”的英文单词怎么写? 耳朵英语单词应该怎么说 耳朵用英语怎么说 眼睛、嘴巴、头、脸、手、胳膊、腿、耳朵的英文单词,脸眼睛耳朵英语单词怎么读? 煲汤容易粘底怎么办? 耳朵的英文单词怎么写 煲汤煲焦了怎么办? 耳朵的英语单词是什么 煲汤,锅烧焦了,怎么洗污渍? 眼睛,英语怎么写?,耳朵,英语怎么写? 电炖锅熬黑米粥粘锅了,怎么办 耳朵的英语单词第一个字母可以换成哪些英语单词? 锅煲粥粘锅怎么办 为什么电紫砂锅煲汤会粘锅底 衣服太透明,里面可以穿什么 这样的衣服太透明了,里面穿什么才合适些? 这衣服上面透视,里面应该怎么穿,求解答/