Android笔记(数据存储收尾以及内容提供者概述)
一、使用SQL语句对SQLite数据库中的数据进行增删改查
步骤如下:
1)初始化一个MyopenHelper类(继承自SQLiteOpenHelper类)
helper = new MyOpenHelper(this);
2)通过getReadableDatabase()/getWriteableDatabase()方法获取SQLiteDatabase对象
SQLiteDatabase db = helper.getReadableDatabase();
3)通过SQLiteDatabase对象,使用SQL语句对数据库的表进行操作
添加数据:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",new String[]{"火影忍者", "岸本齐史", "1000", "5000"});
修改数据:
db.execSQL("update Book set price = ? where name = ?", new String[]{"500", "海贼王"});
删除数据:
db.execSQL("delete from Book where name = ?", new String[]{"火影忍者"});
查询数据:
Cursor cursor = db.rawQuery("select * from Book", null);
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("MA", "书名是" + name);
Log.d("MA", "书的作者是" + author);
Log.d("MA", "书的页数是" + pages);
Log.d("MA", "书的价格是" + price);
}while(cursor.moveToNext());
}
数据查询结束要将游标对象关闭
cursor.close();
4)使用close方法释放SQLiteDatabase对象所占用的资源
db.close();
二、数据库事务
1. 数据库事务四个基本要素ACID
分别为:
原子性,一致性,隔离性,持久性
基本要素的叙述具体见课本p121
2. 数据库事务的写法:
1)初始化一个MyopenHelper类(继承自SQLiteOpenHelper类)
helper = new MyOpenHelper(this);
2)通过getReadableDatabase()/getWriteableDatabase()方法获取SQLiteDatabase对象
SQLiteDatabase db = helper.getReadableDatabase();
3)开启数据库事务
db.beginTransaction();
4)执行数据库事务中的SQL语句
db.execSQL("update Amoney set money = money-1000 where name =?", new Object[] { "李四" });
db.execSQL("update Amoney set money = money+1000 where name =?", new Object[] { "张三" });
5)标记数据库事务执行成功
db.setTransactionSuccessful();
注:这一步很重要,如果有这条语句就会提交数据,没有则会回滚数据
6)关闭数据库事务
db.endTransaction();
7)使用close方法释放SQLiteDatabase对象所占用的资源
db.close();
完整写法:
helper = new MyOpenHelper(this);
db = helper.getReadableDatabase();
db.beginTransaction();
try {
db.execSQL("update Amoney set money = money-1000 where name =?", new Object[] { "李四" });
db.execSQL("update Amoney set money = money+1000 where name =?", new Object[] { "张三" });
db.setTransactionSuccessful();
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.endTransaction();
db.close();
}
总结:使用数据库事务的两个有点在于安全性和高效性,安全性在于
数据库事务是一个不可在分割的单位,事务中的操作要么全部成功,
要么全部失败回滚。
高效性在于,当执行许多条SQL语句时,使用数据库事务的执行速度
要远远快于不使用数据库事务的执行速度。
三、内容提供者概述
1. 用处:跨程序共享数据
2. ContentProvider的工作原理:
1)A程序需要使用ContentProvider暴露数据
2)B程序必须使用ContentResolver类才能操作A程序暴露出来的数据
3)A程序将操作结果返回给ContentResolver
4)ContentResolver将操作结果返回给B程序
四、Android运行时权限
1. 正常权限和危险权限:
Android 6.0及以上,Android的权限被分为正常权限和危险权限。
正常权限:表示不会直接给用户隐私权带来风险的权限。如请求网络的权限。
危险权限:表示涉及到用户隐私的权限,申请了该权限的应用,可能涉及了用户隐私信息的数据或资源,也可能对用户存储的数据或其他应用的操作产生影响。
九组危险权限:位置(LOCATION)、日历(CALENDAR)、照相机(CAMERA)、联系人(CONTACTS)、存储卡(STORAGE)、传感器(SENSORS)、麦克风(MICROPHONE)、电话(PHONE)和短信(SMS)
2. 申请正常权限的方式(静态申请权限)
在AndroidManifest.xml添加
<uses-permission android:name="android.permission.相应的权限"/>
3. 申请危险权限的方式(Android运行时动态申请权限)
譬如申请打电话的权限的写法:
1)在AndroidManifest.xml添加
<uses-permission android:name="android.permission. CALL_PHONE"/>
2)判断当前的应用程序是否获得了打电话权限
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.
permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new
String[]{Manifest.permission.CALL_PHONE}, 1);
}
else{
call();
}
注:ContextCompat.checkSelfPermission方法是用来检查当前程序是否获得了某个权限,成功返回PackageManager.PERMISSION_GRANTED失败返回PackageManager.PERMISSION_DENIED。失败了调用 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1); 方法来申请权限,成功了直接拨打电话。
3)重写onRequestPermissionsResult方法,该方法申请完权限时调用
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch(requestCode){
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
}else{
Toast.makeText(this, "你拒绝了授权", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}