此篇博客只有代码实例及注释,不讲原理:
一、创建数据库类,并继承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'; } }); } } (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|