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:

        }

}

posted @ 2022-04-25 12:29  Atomyzd  阅读(47)  评论(0编辑  收藏  举报