Android学习第六周_SQLite和ContentProvider
16lz
2021-01-25
一、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)更新数据
//updateContentValues 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;@Overridepublic boolean onCreate() { mDatabaseHelper = new DatabaseHelper(getContext()); return false;}@Nullable@Overridepublic 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@Overridepublic String getType(Uri uri) { return null;}@Nullable@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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; }}
三、总结
这章不是很懂,需要对练习……..
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android使用Volley获取json数据
- Android(安卓)常用 mimeType 表
- Android数据缓冲区和数据流的学习总结(BufferedWriter、Buffered
- android 短信 彩信 数据库
- Android(安卓)客户端Socket 实现及简单封装。
- 照片上传图片旋转(ios和android)