一、SQLite
1、基本概念
SQLite是一个轻量级、独立、隔离、跨平台、多语言接口、安全性高的关系型数据库,主要用于嵌入式设备之上,Android中的数据库就是使用的是SQLite数据库。
2、创建数据库
1)创建类
public class DataBaseHelper extends SQLiteOpenHelper
2)编写DataBaseHelper的构造方法
public DataBaseHelper(Context context){
super(context,DATABASE_NAME,null,1);
}
3)重写SQLiteOpeenHelper的onCreate和onUpgrade方法
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + USER_TABLE_NAME +" "+ "(" + USERNAME + " varchar(20) not null," + PASSWORD + " varchar(32) not null," + STATE + " boolean not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
String sql = "drop table if exists" + USERNAME;
db.execSQL(sql);
this.onCreate(db);
}
}
3、操作数据库
1)在MainActivity中调用已经创建好的数据库
DatabaseHelper databaseHelper = new DatabaseHelper(this);
mSqLiteDatabase = databaseHelper.getWritableDatabase();
2)在创建好的数据库中添加数据
private void addData() {
// IO操作,建议后台操作
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.USERNAME, "xxxx");
contentValues.put(DatabaseHelper.AGE, "119");
long rowNumber = mSqLiteDatabase.insert(DatabaseHelper.USER_TABLE_NAME, null , contentValues);
if(rowNumber != -1){
Toast.makeText(DatabaseButtonActivity.this, "插入成功", Toast.LENGTH_SHORT).show();
}
}
3)删除数据
// delete:
String whereClauseString = "username=?";
String[] whereArgsString = {"xxxx"};
mSqLiteDatabase.delete(DatabaseHelper.USER_TABLE_NAME, whereClauseString, whereArgsString);
4)更新数据
//update
ContentValues mContentValues = new ContentValues();
mContentValues.put("age","10");
whereClauseString = "username=?";
sqLiteDatabase.update("user",contentValues,whereClauseString,whereArgsString);
5)对数据的优化
- 原始SQL语句执行效率更高rawQuery execSQL;
- 只检索有用的列、有用的行,越少越好;
- 在数据比较多的时候,需要进行排序;
- 创建索引,因为当数据很多时需要创建索引,方便查找。
- 如果一次性要处理很多数据的时候就需要使用事物处理
事物处理的代码如下:
// 开始事务 此时db会被锁定
mSqLiteDatabase.beginTransaction();
try {
// 做你的操作
for (int i = 0; i < 1000; i++) {
mSqLiteDatabase.execSQL("insert into user(username, age) values ('liu da ming','5岁')");
}
mSqLiteDatabase.setTransactionSuccessful();
// 设置成功
} catch (Exception e) {
e.printStackTrace();
} finally {
mSqLiteDatabase.endTransaction();
}
6)ORM对象关系映射
将一个对象和一个关系型数据进行绑定,这样就不要操作复杂的sql语句,而直接对对象的属性和方法进行操作,对于简单的数据库是个很好的选择。
二、ContentProvider
1、基本的概念
- 应用程序间共享数据的一种方式
- 为存储和获取数据提供了统一的接口
- Android为常见的一些数据提供了默认的ContentProvider
- Uri,通用资源标识符
2、ContentProvider的接口
public class TestContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
3、实例
public class TestContentProvider extends ContentProvider {
private static UriMatcher sUriMatcher;
public static final int URI_MATCH_USER = 1;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(URIList.AUTHORITY,DatabaseHelper.USER_TABLE_NAME,URI_MATCH_USER);
}
private DatabaseHelper mDatabaseHelper;
@Override
public boolean onCreate() {
mDatabaseHelper = new DatabaseHelper(getContext());
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
String tablename = getTableName(uri);
if(TextUtils.isEmpty(tablename)){
return null;
}
Cursor cursor = mDatabaseHelper.getReadableDatabase().query(tablename,projection,selection,selectionArgs,null,null,sortOrder);
return cursor;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
String tablename = getTableName(uri);
if(TextUtils.isEmpty(tablename)){
return null;
}
long id = mDatabaseHelper.getWritableDatabase().insert(tablename,null,values);
return ContentUris.withAppendedId(uri,id);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String tablename = getTableName(uri);
if(TextUtils.isEmpty(tablename)){
return -1;
}
int count = mDatabaseHelper.getWritableDatabase().delete(tablename,selection,selectionArgs);
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
String tablename = getTableName(uri);
if(TextUtils.isEmpty(tablename)){
return -1;
}
int count = mDatabaseHelper.getWritableDatabase().update(tablename,values,selection,selectionArgs);
return count;
}
private String getTableName(Uri uri){
int type = sUriMatcher.match(uri);
String tablename = null;
switch (type){
case URI_MATCH_USER:
tablename = DatabaseHelper.USER_TABLE_NAME;
break;
}
return tablename;
}
}
三、总结
这章不是很懂,需要对练习……..