SQLite与ContentProvider
http://www.rom007.com/SQLite-yu-ContentProvider.html
在Android中,对于数据的存贮,有几种方式,有文件方式,有文件式数据库方式,Android自带了一个SQLite数据库,做嵌入开发的人对这个跨平台的本地文件数据库一定不会陌生,在Android对于数据的访问,提出了新的方式,ContentProvider方式,类似于MS的ContentProvider方式的,OLEDB,及ODBC统一的数据方式。
我们首先来看看SQLite在
Android中的使用,在Android中有最简单的使用方式,就是利Context对象的openorCreateDatabase
我们来看看一段代码:
package test.DB;
import android.app.Activity;
import android.content.Intent;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import
android.view.Menu;
import android.view.MenuItem;
import
android.widget.TextView;
public class DBActivity extends Activity {
private SQLiteDatabase mdb =
null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDatabase();
setContentView(R.layout.main);
}
@Override
public
boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method
stub
super.onCreateOptionsMenu(menu);
menu.add(1, Menu.FIRST +1, 1,
“GetName”);
menu.add(1, Menu.FIRST +2, 2, “Test”);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
// TODO
Auto-generated method stub
super.onOptionsItemSelected(item);
switch
(item.getItemId())
{
case Menu.FIRST+ 1:
{
TextView tv =
(TextView)this.findViewById(R.id.view_main);
tv.setText(this.getName());
break;
}
case Menu.FIRST +
2:
{
this.setTitle(“Del Item…”);
break;
}
}
return true;
}
private void initDatabase()
{
mdb
= this.openOrCreateDatabase(“dbfile”, 0, null);
String sql_create =
“create table test (id int, name TEXT)”;
mdb.execSQL(sql_create);
String sql_insert = “insert into test(id, name)
values(3, ‘name3′)”;
mdb.execSQL(sql_insert);
}
private
String getName()
{
String name = null;
Cursor cur =
mdb.rawQuery(“select * from test”, null);
cur.moveToFirst();
while (!cur.isLast())
{
name = name + cur.getString(1)+
“\r\n”;
cur.moveToNext();
}
return name;
}
}
我们再来看看单独使用SQLiteOpenHelper方式:
先由SQLiteOpenHelper继承一个数据库操作类,其中onCreate,
onUpgrade必须重载并实现,
package test.DB;
import android.content.Context;
import android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
@Override
public
void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
// TODO Auto-generated method stub
}
public
DatabaseHelper(Context ct,String dbName)
{
super(ct,dbName,null,1);
}
public boolean insert(String insert)
{
this.getWritableDatabase().execSQL(insert);
return true;
}
public
boolean update(String update)
{
this.getWritableDatabase().execSQL(update);
return true;
}
public
boolean delete(String del)
{
this.getWritableDatabase().execSQL(del);
return true;
}
public Cursor
query(String query)
{
Cursor cur =
this.getReadableDatabase().rawQuery(query, null);
return
cur;
}
}
再创建一个使用者(消费者)
package test.DB;
import android.app.Activity;
import android.content.Intent;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import
android.view.Menu;
import android.view.MenuItem;
import
android.widget.TextView;
public class DBActivity extends Activity {
private SQLiteDatabase mdb =
null;
private DatabaseHelper helper = null;
/** Called when the
activity is first created. */
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDatabase();
setContentView(R.layout.main);
}
@Override
public
boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method
stub
super.onCreateOptionsMenu(menu);
menu.add(1, Menu.FIRST +1, 1,
“GetName”);
menu.add(1, Menu.FIRST +2, 2, “Test”);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
// TODO
Auto-generated method stub
super.onOptionsItemSelected(item);
switch
(item.getItemId())
{
case Menu.FIRST+ 1:
{
TextView tv =
(TextView)this.findViewById(R.id.view_main);
tv.setText(this.getName());
break;
}
case Menu.FIRST +
2:
{
this.setTitle(“Del Item…”);
break;
}
}
return true;
}
private void initDatabase()
{
helper = new DatabaseHelper(this,”dbfile”);
//mdb =
this.openOrCreateDatabase(“dbfile”, 0, null);
//String sql_create =
“create table test (id int, name TEXT)”;
//mdb.execSQL(sql_create);
String sql_insert = “insert into test(id,
name) values(55, ‘namexx’)”;
//mdb.execSQL(sql_insert);
helper.insert(sql_insert);
}
private String getName()
{
String name = null;
//mdb =
helper.getReadableDatabase();
Cursor cur = helper.query(“select * from
test”);
cur.moveToFirst();
do
{
name = name +
cur.getString(1)+ “\n”;
} while(cur.moveToNext());
return name;
}
}
这些代码读起来是不是有点Visual
Basic的感觉?呵呵,所以,以后说不定.net,Android,java,blackberry,最终都成为一致的API,当然,这只是我们的期望,这样大家不必整天花这么多时间学这些无聊的接口了。
好了,该我们的ContentProvider出场了,与Service,BroadcastReceiver等组件一样,继承特定的Interface,在AndroidManifest.xml里声明这个ContentProvider,调用者就可以拿来使用了。
首先我们定义一个ContentProvider:
package test.DB;
import android.content.ContentProvider;
import
android.content.ContentValues;
import android.database.Cursor;
import
android.net.Uri;
import android.widget.Toast;
public class TestProvider extends ContentProvider {
private
DatabaseHelper mdbHelper = null;
final static String TABLE_NAME =
“test”;
@Override
public int delete(Uri arg0, String arg1, String[] arg2)
{
mdbHelper.getWritableDatabase().delete(TABLE_NAME, arg1, arg2);
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated
method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO
Auto-generated method stub
mdbHelper.getWritableDatabase().insert(TABLE_NAME, “”, values);
return
null;
}
@Override
public boolean onCreate() {
// TODO Auto-generated method
stub
mdbHelper = new DatabaseHelper(this.getContext(), “dbfile”);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String
selection,
String[] selectionArgs, String sortOrder) {
Cursor cur =
mdbHelper.getReadableDatabase().query(TABLE_NAME,projection,selection,null,null,null,
null);
Toast.makeText(this.getContext(), “test Cur!”,
Toast.LENGTH_SHORT);
return cur;
}
@Override
public int update(Uri uri, ContentValues values, String
selection,
String[] selectionArgs) {
mdbHelper.getWritableDatabase().update(TABLE_NAME, values, selection,
null);
return 0;
}
}
老规矩,AndroidManifest.xml来定义这个Provider
<provider
android:label=”test_provider” android:authorities=”com.my.provider”
android:name=”TestProvider”>
</provider>
这里的android:authorities
=
“com.my.provider”是标识这个ContentProvider,调用者可以根据这个标识来找到它,
我们组合一个能找到它的Uri,
public
class ProviderConst {
public static final Uri MY_TEST_URI =
Uri.parse(“content://com.my.provider/test”);
}
content
指的是内容提供者ContentProvider。
//com.my.provider映射到我们已定义的那个ContentProvider标识
/test这个作为一个参数,传给ContentProvider,可以根据这个参数来决定操作目标,比如数据库中的哪张表,文件中的那一部分数据等。
我们来操作这个内容提供者:
private
String getName()
{
String name = null;
Cursor cur =
this.getContentResolver().query(ProviderConst.MY_TEST_URI,new
String[]{“id”,”name”},null, null, null);
if (cur == null)
return null;
cur.moveToFirst();
do
{
name =
name + cur.getString(1)+ “\n”;
} while(cur.moveToNext());
return name;
}
我们也可以这样使用:
private String getName()
{
String name = null;
Cursor cur =
this.managedQuery(ProviderConst.MY_TEST_URI,new String[]{“id”,”name”},null,
null, null);
if (cur == null)
return null;
cur.moveToFirst();
do
{
name = name +
cur.getString(1)+ “\n”;
} while(cur.moveToNext());
return name;
}
SQLite与ContentProvider的更多相关文章
- 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider
一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...
- Android中操作数据的集中方式---文件,SQLite,ContentProvider
http://blog.csdn.net/he90227/article/details/33734239 转
- Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider
Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/data/程 ...
- Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)
本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...
- Android ContentProvider基本用法
转自:https://www.jianshu.com/p/601086916c8f 一.基本概念 ContentProvider是Android系统中提供的专门用户不同应用间进行数据共享的组件,提供了 ...
- 独立开发 一个社交 APP 的架构分享 (已实现)
(本博客为原创:http://www.cnblogs.com/linguanh/) My BananaCloud Android Application 前言: 这算是我的第一个 完完全全 由自 ...
- Android 基础篇(二)
ADB进程 adb指令 adb install xxx.apk adb uninstall 包名 adb devices adb start-server adb kill-server adb sh ...
- Android高手速成--第二部分 工具库
主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...
- Android开源项目分类汇总
目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
随机推荐
- TruncateATable 清除一张表
当我们想删除一张表的全部数据时,我们可以使用 truncate 关键字,但如果要删除的表的主键被引用了,那么就无法执行语句. 1.制作清除数据的工具 ,在 nuget 控制台中输入 Install-P ...
- css常见的概念
padding-top:10px;是指容器内的内容距离容器的顶部有10个像素,是包含在容器内的: margin-top:10px;是指容器本身的顶部距离其他容器有10个像素,不包含在容器内: top: ...
- 【项目 · Wonderland】预则立 && 他山之石
[软 工 实 践 · 团 队 作 业] 预则立&&他山之石 标签:WonderLand Part 0 · 简要目录 Part 1 · 团队计划 Part 2 · 团队访谈 Part 3 ...
- Ecstore 默认图片压缩质量差的问题解决方法
修改app/image/lib/clip.php文件 }elseif( function_exists('imagecopyresampled')){ $quality = 80; $image_p ...
- 封装Ajax框架!(代码篇)
写在前面的话,如果中间有什么不明白的,请先看封装ajax框架!(前言篇) 1.添写一个封闭函数 (function(){})(); 在一个项目中,可能会引用多个js框架,如果函数名相同,会有命名冲突, ...
- pdf阅读器开发
文章基于sumatrapdf的实现(当中mupdf中的内容不会太多涉及).以及自己在此基础上做的 优化,扩展.详细效果能够參考百度阅读器精简版. 最NB的还是得属于foxit.渲染速度一流,展示大图片 ...
- 飞冰ICE
一. 飞冰目标与愿景(同时也概况飞冰是什么) 飞冰是一套基于 React 的中后台应用解决方案,在阿里巴巴内部,已经有 270 多个来自几乎所有 BU 的项目在使用.经过 2 年的发展,飞冰已经是中后 ...
- Android关于LinearLayout和RelativeLayout背景设置的区别
1.LinearLayout:设置背景时即设置android:background时,假如LayoutLayout设置了android:layout_width="wrap_content& ...
- 蓝桥杯之 2n皇后问题(双层dfs,暴力)
Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后 和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两 个白皇后都不在同 ...
- 备份时如何排除掉默认的 information_schema 和 mysql 库?
备份时如何排除掉默认的 information_schema 和 mysql 库? mysql -e "show databases;" -uroot -ppassword | g ...