ContentProvider操作SQLite数据库实例

前端之家收集整理的这篇文章主要介绍了ContentProvider操作SQLite数据库实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

此篇博客只有代码实例及注释,不讲原理:

一、创建数据库类,并继承sqliteOpenHelper类,sqliteOpenHelper是Android封装的数据操作类,该类有一个内部类sqliteDatabase,该内部完成对

数表具体的“增删改查”操作。下面是数据库的具体代码

import android.content.Context;
import android.database.sqlite.sqliteDatabase;
import android.database.sqlite.sqliteDatabase.CursorFactory;
import android.database.sqlite.sqliteOpenHelper;
public class sqliteUtil extends sqliteOpenHelper {
/**
* 该构造函数必须存在
* @param context
* :Activity对象
* @param name
* :数据库
* @param factory
* : 可传null
* @param version
* : 当前数据的板本,必须是正数递增
*/
public sqliteUtil(Context context,String name,CursorFactory factory,
int version) {
super(context,name,factory,version);
}
/**
* 该函数在第一次创建时候执行,即第一次得到sqliteDatabase对象的时候被调用
*/
@Override
public void onCreate(sqliteDatabase db) {
System.out.println("sqliteUtil.class: create a Database");
// 创建数据表的sql语句
db.execsql("create table stu(id int,name varchar(10))");
}

/**
** 当板本变化时会被自动调用,方法会被自动调用.
*/
@Override
public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
System.out.println("update a Dababase");
}


@Override
public void onOpen(sqliteDatabase db) {
super.onOpen(db);
}
}


二、创建内容提供者类,该类继承ContentProvider类。并在该类的onCreate()回调函数中执行刚才创建的sqliteUtil 类,从而创建数据及数据表。其具体代码如下:

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.sqliteDatabase;
import android.net.Uri;
public class MyContentProvider extends ContentProvider {
private sqliteUtil util;
private sqliteDatabase db;
/**
* 删除成功返回1,删除失败返回-1
*/
@Override
public int delete(Uri arg0,String id,String[] arg2) {
try {
// db.execsql("delete from stu where id='" + id + "'");// 返回值是:void
db.delete("stu",id,arg2);
return 0;
} catch (Exception e) {
return -1;
}
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
/***
* 保存数据
*/
@Override
public Uri insert(Uri uri,ContentValues values) {
db.insert("stu",null,values);// 保存数据
return uri;
}
/**
* 创建数据库方法是在布置Androd项目的时候就会被自动调用,即android项目被部署时ContentProvider就会被自动创建
*/
@Override
public boolean onCreate() {
//在调用ContentProvider时,
util = new sqliteUtil(this.getContext(),"firstDB",4);
db = util.getReadableDatabase();

return true;
}
/**
* 查询
*/
@Override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) {
// db = util.getReadableDatabase();
// db.query("表名","字段名字符串数组","weher子句",
// "where子句占位符值,字符串数组","分组字段名字符串",
// "having的的字段","排序字段")
// 当没有某项进填null;
Cursor cursor = db.query("stu",projection,selection,selectionArgs,null);
return cursor;
}
/**
* 修改
*/
@Override
public int update(Uri uri,ContentValues values,
String[] selectionArgs) {
db = util.getReadableDatabase();
//stu是表名; 第三个参数是占位符的值.
//id是wehere子句:如可以写成
//db.update("stu",cv,"id=? or id=?",new String[]{"1","2"});
return db.update("stu",values,selectionArgs);
}
}


三、在该工程的mainfest.xml文件注册内容提供者:

<provider android:authorities="cde"android:name=".MyContentProvider"></provider>

注:android:authorities属性:可以理解为设置该内容提供在android系统中的地址,该地属性值虽然是自定义,但必须该值在android系统里是唯一的,所以

习惯把该属性值设置成“包名.类名”。


四、由于ContentProvider是可以跨进程访问的,也以其他应用程序可以通过该内容提供者访问该程序的sqlite数据库

在使用内容提供者时,要知道内容提供者在android系统中的Urif地址,其地址形式:content://地址,content://是协议头,类似于http://,ftp://等。

双斜杠后面的“地址”就是内容提供者在mainfest.xml文件android:authorities属性值。

ContentValues:是android系统封装的一个健值对对象,类似于Map。

ContentResolver :是内容提供者具体执行“增删改查”的对象,该对象是通过Activity的getContentResolver()方法得到。

代码如下:

import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;


public class MainActivity extends Activity {
Uri uri = Uri.parse("content://cde");
ContentValues cv = new ContentValues();
ContentResolver cr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

cr = MainActivity.this.getContentResolver();

Button insert = (Button) findViewById(R.id.insert); Button select = (Button) findViewById(R.id.select); Button updata = (Button) findViewById(R.id.updata); Button delete = (Button) findViewById(R.id.delete); insert.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cv.put("id",233); cv.put("name","wgr"); cr.insert(uri,cv); cv.clear(); } }); select.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Cursor cursor = cr.query(uri,new String[] { "id","name" },"id=?",new String[] { "233" },null); //等价于select id,name from stu where id = '233'; while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); String id = cursor.getString(cursor.getColumnIndex("id")); System.out.println("名字是: " + name + " 密码是: " + id); } cursor.close(); } }); updata.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cv.put("name","zwb"); cr.update(uri,new String[] { "233" }); //等价于updata stu set name = 'zwb' where id = '233'; cv.clear(); } }); delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cr.delete(uri,new String[] { "233" }); //等价于delete from stu where id = '233'; } }); } }

猜你在找的Sqlite相关文章