Android SQLite数据结合ContentProvider实现数据的一个增删改查操作

阅读: 评论:0

Android SQLite数据结合ContentProvider实现数据的一个增删改查操作

Android SQLite数据结合ContentProvider实现数据的一个增删改查操作

#Android SQLite数据结合ContentProvider实现数据的一个增删改查操作
使用ContentProvider控制数据库,可以实现程序本身数据的增删改查,也可让别的程序对本程序的数据库进行增删改查操作,只需要在AndroidManifest中改属性exported,是true还是false就可以了。

本文也提供一个示例程序,这个示例程序是一个新项目中需要用到的,并且封装比较好,逻辑清晰,对于后期添加多个数据库表格管理起来很方便。

效果图:

该示例没有输入操作,简单实现了增删改查操作,具体的实现和控制看代码即可。
###1、DBOpenHelper类


package com.liwenzhi.asr.sqlitedemo.provider;t.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import com.liwenzhi.asr.sqlitedemo.table.PeopleInfoTable;
import com.liwenzhi.asr.sqlitedemo.util.LogUtil;//控制数据库的创建和删除的类
public class DBOpenHelper extends SQLiteOpenHelper {//这里数据库路径是默认的路径,如果需要也是可以放在SD卡下的,只需要将下面的数据库名称改为“sdcard/demo/file.db”//但是要注意,如果存储在sd卡下是需要手机的读取权限的,如果放在包名下是不需要手机读写权限的private static final String DATABASE_NAME = "file.db"; //默认路径(/data/data/package/...)+数据库名称private static final int DATABASE_VERSION = 1;//数据库版本private final String TAG = "DBOpenHelper";public DBOpenHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);LogUtil.i(TAG, "DBOpenHelper:DATABASE_NAME=" + DATABASE_NAME + ",DATABASE_VERSION=" + DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {LogUtil.i(TAG, "DBOpenHelper onCreate");db.execSQL(PeopleInfoTable.CREATE_PEOPLE_INFO_TABLE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {LogUtil.e(TAG, "DBOpenHelper onUpgrade:oldVersion=" + oldVersion + ",newVersion=" + newVersion);db.execSQL("DROP TABLE IF EXISTS " + PeopleInfoTable.TABLE_NAME);  //删除表格onCreate(db);   //重新创建表格}}

###2、SqliteProvider类

package com.liwenzhi.asr.sqlitedemo.provider;t.ContentProvider;
t.ContentUris;
t.ContentValues;
t.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.Uri;
import android.util.Log;import com.liwenzhi.asr.sqlitedemo.table.PeopleInfoTable;
import com.liwenzhi.asr.sqlitedemo.util.LogUtil;//真正实现控制数据库增删改查的代码类
public class SqliteProvider extends ContentProvider {private DBOpenHelper dbOpenHelper;private static final UriMatcher MATCHER;private String TAG = "SqliteProvider-->";private final Object mLock = new Object();//Uri info//authoritypublic static final String PEOPLE_INFO_AUTHORITY = "com.demo.FileProvider";public static final Uri AUTHORITY_URI = Uri.parse("content://" + PEOPLE_INFO_AUTHORITY);//codeprivate static final int PEOPLE_INFO_CODE = 1;static {MATCHER = new UriMatcher(UriMatcher.NO_MATCH);MATCHER.addURI(PEOPLE_INFO_AUTHORITY, PeopleInfoTable.TABLE_NAME, PEOPLE_INFO_CODE);}@Overridepublic boolean onCreate() {Log.d(TAG, " onCreate ");this.dbOpenHelper = new Context());return true;}@Overridepublic String getType(Uri uri) {return null;}/*** 查询数据库的数据** @param uri* @param projection* @param selection* @param selectionArgs* @param sortOrder* @return*/@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Log.d(TAG, " query ");try {synchronized (mLock) {SQLiteDatabase db = ReadableDatabase();switch (MATCHER.match(uri)) {case PEOPLE_INFO_CODE:return db.query(PeopleInfoTable.TABLE_NAME, projection, selection, selectionArgs,null, null, sortOrder);default:throw new IllegalArgumentException("Unkwon Uri:" + String());}}} catch (SQLException e) {LogUtil.e(TAG, "query error:" + e.getMessage());return null;}}/*** 插入数据** @param uri* @param values* @return*/@Overridepublic Uri insert(Uri uri, ContentValues values) {Log.d(TAG, " insert ");SQLiteDatabase db = WritableDatabase();switch (MATCHER.match(uri)) {case PEOPLE_INFO_CODE:// 特别说一下第二个参数是当name字段为空时,将自动插入一个NULL。long rowid = db.insert(PeopleInfoTable.TABLE_NAME, null, values);Uri insertUri = ContentUris.withAppendedId(uri, rowid);// 得到代表新增记录的Context().getContentResolver().notifyChange(uri, null);return insertUri;default:throw new IllegalArgumentException("Unkwon Uri:" + String());}}/*** 删除数据** @param uri* @param selection* @param selectionArgs* @return*/@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = WritableDatabase();int count = 0;switch (MATCHER.match(uri)) {case PEOPLE_INFO_CODE:count = db.delete(PeopleInfoTable.TABLE_NAME, selection, selectionArgs);return count;default:throw new IllegalArgumentException("Unkwon Uri:" + String());}}/*** 修改数据** @param uri* @param values* @param selection* @param selectionArgs* @return*/@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase db = WritableDatabase();int count = 0;switch (MATCHER.match(uri)) {case PEOPLE_INFO_CODE:count = db.update(PeopleInfoTable.TABLE_NAME, values, selection, selectionArgs);return count;default:throw new IllegalArgumentException("Unkwon Uri:" + String());}}}  

###3、PeopleInfo类

package com.liwenzhi.asr.sqlitedemo.bean;/*** 人物信息*/public class PeopleInfo {private int id;private String name;private int age;private int height;private float weight;private String remark;public PeopleInfo() {}public PeopleInfo(String name, int age, int height, float weight, String remark) {this.name = name;this.age = age;this.height = height;this.weight = ark = remark;}public PeopleInfo(int id, String name, int age, int height, float weight, String remark) {this.id = id;this.name = name;this.age = age;this.height = height;this.weight = ark = remark;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public float getWeight() {return weight;}public void setWeight(float weight) {this.weight = weight;}public String getRemark() {return remark;}public void setRemark(String remark) {ark = remark;}@Overridepublic String toString() {return "PeopleInfo{" +"id=" + id +", name='" + name + ''' +", age=" + age +", height=" + height +", weight=" + weight +", remark='" + remark + ''' +'}';}
}

###4、PeopleInfoTable类

package com.liwenzhi.asr.sqlitedemo.table;t.ContentValues;
import android.database.Cursor;
import android.Uri;import com.liwenzhi.asr.sqlitedemo.bean.PeopleInfo;
import com.liwenzhi.asr.sqlitedemo.provider.SqliteProvider;/*** 管理单个表格的类,*定义了对应的字符串*创建表格的语句*设置对象和获取对象的语句*/public class PeopleInfoTable {//表名称public static final String TABLE_NAME = "filePath";//表格的基本信息的字符串public static final String ID = "_id";public static final String NAME = "name";public static final String AGE = "age";public static final String HEIGHT = "height";public static final String WEIGHT = "weight";public static final String REMARK = "remark";//创建个人信息表格的字符串命令 ,四个属性自增主键id,姓名,年龄,身高,体重,备注public static final String CREATE_PEOPLE_INFO_TABLE = "CREATE TABLE " + TABLE_NAME +" (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT," + AGE + " INTEGER,  " + HEIGHT + " INTEGER, " +WEIGHT + " FLOAT, " + REMARK + " TEXT)";//需要进行操作的uri对象private static final Uri CONTENT_URI = Uri.withAppendedPath(SqliteProvider.AUTHORITY_URI, TABLE_NAME);//返回PeopleInfo表格操作的uri地址对象public static Uri getContentUri() {return CONTENT_URI;}public static ContentValues putValues(PeopleInfo info) {ContentValues values = new ContentValues();values.put(NAME, Name());values.put(AGE, Age());values.put(HEIGHT, Height());values.put(WEIGHT, Weight());values.put(REMARK, Remark());return values;}public static PeopleInfo getValues(Cursor cursor) {int id = ColumnIndex(ID));String name = ColumnIndex(NAME));int age = ColumnIndex(AGE));int height = ColumnIndex(HEIGHT));float weight = ColumnIndex(WEIGHT));String remark = ColumnIndex(REMARK));PeopleInfo peopleInfo = new PeopleInfo(id, name, age, height, weight, remark);return peopleInfo;}}

###5、DataManager类


package com.liwenzhi.asr.sqlitedemo.manager;t.ContentResolver;
t.ContentValues;
t.Context;
import android.database.Cursor;
import android.Uri;import com.liwenzhi.asr.sqlitedemo.bean.PeopleInfo;
import com.liwenzhi.asr.sqlitedemo.table.PeopleInfoTable;import java.util.ArrayList;
import java.util.List;/*** 数据管理类*管理所有数据库表格的增删改查操作*/public class DataManager {static final String TAG = "DataManager";public static void addPeople(Context context, PeopleInfo info) {ContentResolver contentResolver = ContentResolver();Uri uri = ContentUri();ContentValues values = PeopleInfoTable.putValues(info);contentResolver.insert(uri, values);}public static void updatePeople(Context context, String name, PeopleInfo info) {ContentResolver contentResolver = ContentResolver();Uri uri = ContentUri();ContentValues values = new ContentValues();values.put(PeopleInfoTable.AGE, Age());values.put(PeopleInfoTable.HEIGHT, Height());values.put(PeopleInfoTable.WEIGHT, Weight());values.put(PeopleInfoTable.REMARK, Remark());values.put(PeopleInfoTable.NAME, Name());contentResolver.update(uri, values, PeopleInfoTable.NAME + "=?", new String[]{name});}public static void deletePeople(Context context, String name) {ContentResolver contentResolver = ContentResolver();Uri uri = ContentUri();contentResolver.delete(uri, PeopleInfoTable.NAME + "=?", new String[]{name});}public static PeopleInfo getOnePeople(Context context, String userName) {PeopleInfo peopleInfo = null;Uri uri = ContentUri();Cursor cursor = ContentResolver().query(uri, null, PeopleInfoTable.NAME + "=?", new String[]{userName}, null);if (cursor != null) {if (veToNext()) {peopleInfo = Values(cursor);}cursor.close();}return peopleInfo;}public static List<PeopleInfo> getAllPeoples(Context context) {List<PeopleInfo> list = new ArrayList<>();Uri uri = ContentUri();Cursor cursor = ContentResolver().query(uri, null, null, null, null);if (cursor != null) {while (veToNext()) {PeopleInfo info = Values(cursor);list.add(info);}cursor.close();}return list;}
}

###6、MainActivity类

package com.liwenzhi.asr.sqlitedemo.activity;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;import com.liwenzhi.asr.sqlitedemo.R;
import com.liwenzhi.asr.sqlitedemo.adapter.PeopleInfoAdapter;
import com.liwenzhi.asr.sqlitedemo.bean.PeopleInfo;
import com.liwenzhi.asr.sqlitedemo.manager.DataManager;import java.util.ArrayList;
import java.util.List;/*** 该示例是SQLite数据结合ContentProvider实现数据的一个增删改查操作的示例代码* 该示例的特点是代码清晰,扩展性好* 简单规范如下:* 1、数据库用到的数据类,放在bean包下* 2、每张数据的表格都在table下创建一个对应的类,并且定义该表格对应的字符串数据和设置ContentValues和获取类对象* 3、DataManager是控制所有数据进行增删改查操作的类,不管是一个数据的一个表格还是多个表格的数据操作* 4、SqliteProvider是实际的增删改查操作语句* 5、后面每次添加表格只要添加bean类、Table类、SqliteProvider中添加对应的过滤和操作,DataManager添加对应的控制代码就可以了*/
public class MainActivity extends AppCompatActivity {private ListView listView;private PeopleInfoAdapter adapter;private List<PeopleInfo> list = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initView() {listView = findViewById(R.id.listView);}private void initData() {adapter = new PeopleInfoAdapter(this, list);listView.setAdapter(adapter);}//增加数据public void insertData(View view) {PeopleInfo peopleInfo = new PeopleInfo("李文志", 18, 170, 61, "reamark:huawei");DataManager.addPeople(this, peopleInfo);}//删除数据public void deleteData(View view) {DataManager.deletePeople(this, "李文志");}//修改数据public void updateData(View view) {PeopleInfo peopleInfo = new PeopleInfo("李文志", 19, 170, 61, "reamark:huawei");DataManager.updatePeople(this, "李文志", peopleInfo);}//查询数据public void selectData(View view) {list.clear();List<PeopleInfo> peopleInfos = AllPeoples(this);list.addAll(peopleInfos);ifyDataSetChanged();}//查询单个数据public void selectOneData(View view) {PeopleInfo peopleInfo = OnePeople(this, "李文志");Toast.makeText(this, peopleInfo + "", Toast.LENGTH_SHORT).show();}}

####运行上面代码,点击添加数据,在点击查询数据,显示:

####点击查询单个数据:

代码如果需要可以下载查看:

适当修改代码,就可以用到项目中了。

#共勉:态度决定人生的高度。

本文发布于:2024-02-04 22:28:30,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170717844960248.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23