问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android 怎么使用sqlcipher

发布网友 发布时间:2022-04-22 01:35

我来回答

1个回答

热心网友 时间:2022-04-08 11:08

  Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作。数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧。在Android中,我们既可以使用原生的SQL语句来对数据进行操作,也可以使用Android API提供的CRUD方法来对数据库进行操作,两种方式各有特点,选择使用哪一种就全凭个人喜好了。

  不过,使用SQLite来存储数据却存在着一个问题。因为大多数的Android手机都是Root过的,而Root过的手机都可以进入到/data/data/<package_name>/databases目录下面,在这里就可以查看到数据库中存储的所有数据。如果是一般的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的程序就会面临严重的安全漏洞隐患。那么今天,就让我们一起研究一下如何借助SQLCipher来解决这个安全性问题。

  SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里我们要学习的自然是Android中SQLCipher的用法了。

  首先要把Android项目所依赖的SQLCipher工具包下载下来:

  接着解压这个工具包,会看到里面有assets和libs这两个目录,稍后需要将这两个目录中的内容添加到Android项目当中。那么现在我们就来新建一个Android项目,项目名就叫SQLCipherTest。观察SQLCipherTest的项目结构,发现里面也分别有一个assets目录和一个libs目录,那么现在就可以把SQLCipher工具包中这两个目录里的内容复制过来。并不需要复制全部文件,选择必要的文件进行复制就可以

  到这里准备工作就全部完成了,接下来我们开始编写代码。首先创建一个MyDatabaseHelper继承自SQLiteOpenHelper,注意这里使用的并不是Android API中的SQLiteOpenHelper,而是net.sqlcipher.database包下的SQLiteOpenHelper,代码如下所示:

[java] view plaincopy
import android.content.Context;  
import net.sqlcipher.database.SQLiteDatabase;  
import net.sqlcipher.database.SQLiteDatabase.CursorFactory;  
import net.sqlcipher.database.SQLiteOpenHelper;  
  
public class MyDatabaseHelper extends SQLiteOpenHelper {  
      
    public static final String CREATE_TABLE = "create table Book(name text, pages integer)";  
  
    public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {  
        super(context, name, factory, version);  
    }  
  
    @Override  
    public void onCreate(SQLiteDatabase db) {  
        db.execSQL(CREATE_TABLE);  
    }  
  
    @Override  
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {  
  
    }  
  
}

  除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。可以看到,我们在onCreate()方法中创建了一张Book表,Book表里有name和pages这两个列。

  接着,打开或新建activity_main.xml作为程序的主布局文件,代码如下所示:

[html] view plaincopy
<LinearLayout xmlns:android="

    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  
      
    <Button   
        android:id="@+id/add_data"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="添加数据"  
        />  
      
    <Button   
        android:id="@+id/query_data"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="查询数据"  
        />  
  
</LinearLayout>

  这里只是简单地放置了两个按钮,分别用于添加和查询数据。接下来打开或新建MainActivity作为程序主Activity,代码如下所示:

[java] view plaincopy
public class MainActivity extends Activity {  
      
    private SQLiteDatabase db;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        SQLiteDatabase.loadLibs(this);  
        MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "demo.db", null, 1);  
        db = dbHelper.getWritableDatabase("secret_key");  
        Button addData = (Button) findViewById(R.id.add_data);  
        Button queryData = (Button) findViewById(R.id.query_data);  
        addData.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                ContentValues values = new ContentValues();  
                values.put("name", "达芬奇密码");  
                values.put("pages", 566);  
                db.insert("Book", null, values);  
            }  
        });  
        queryData.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Cursor cursor = db.query("Book", null, null, null, null, null, null);  
                if (cursor != null) {  
                    while (cursor.moveToNext()) {  
                        String name = cursor.getString(cursor.getColumnIndex("name"));  
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));  
                        Log.d("TAG", "book name is " + name);  
                        Log.d("TAG", "book pages is " + pages);  
                    }  
                }  
                cursor.close();  
            }  
        });  
    }  
  
}

  可以看到,在onCreate()方法中首先调用了SQLiteDatabase的loadLibs()静态方法将SQLCipher所依赖的so库加载进来,注意这里使用的是net.sqlcipher.database包下的SQLiteDatabase。然后我们创建了MyDatabaseHelper的实例,并调用getWritableDatabase()方法去获取SQLiteDatabase对象。这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。

  在添加数据按钮的点击事件里面,我们通过ContentValues构建了一条数据,然后调用SQLiteDatabase的insert()方法将这条数据插入到Book表中。

  在查询数据按钮的点击事件里面,我们调用SQLiteDatabase的query()方法来查询Book表中的数据,查询到的结果会存放在Cursor对象中,注意这里使用的是net.sqlcipher包下的Cursor。然后对Cursor对象进行遍历,并将查询到的结果打印出来。

  现在运行一下程序,先点击添加数据按钮,再点击查询数据按钮,刚刚添加的那条数据就应该在控制台里打印出来了。

  有没有感觉到使用SQLCipher提供的API和使用Android原生的数据库API,操作起来几乎是一模一样的。没错,SQLCipher对Android SDK中所有与数据库相关的API都制作了一份镜像,使得开发者可以像操作普遍的数据库文件一样来操作SQLCipher,而所有的数据加解密操作,SQLCipher都在背后帮我们处理好了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎样让孩子主动找老师补课? 表格列求和公式怎么设置 求和函数公式怎么输入 北京注册成立一个公司需要多少钱 北京公司都是什么 手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 android contentprovider 有什么用 跪求!桃花的动漫图片。唯美,古风。可以有人物。 求一张600*800像素的古风漫画图片 漫画图片唯美古风女生有狐狸耳朵的拿伞的 求几张古风,唯美的图片,要清晰的,最好有人物,... 求几张唯美古风人物插画图片,中国风插画类的 我想要一些高清唯美的古风人物的图片 求古风的漫画图片,里面的人物就像是唱京剧的打扮 古风漫画霸气女皇图片 西安职业高中(职高)哪个口碑好? 西安市重点职业高中有哪些 西安的职业高中有哪些?哪家靠谱点? 西安都有哪些职业高中? 西安职业高中学校排名榜 西安的职业学校有些什么? 2021陕西十大职业高中都有那些? 西安市重点职业高中有哪些? 西安职业高中排名? 西安职业高中最新排名情况,可以提供高考课程的? 西安职业高中排名(可以提供高考课程的)? 如何进行Android数据库操作 风水卫生间在北边好还的南边好 如何对android多媒体数据库进行增删改 厕所设于居室北面是大凶,这与风水有什么联系吗? 怎么提高android contentresolver的查询效率优化 厕所在正北好不好? android 怎么往数据库里面添加数据 坐南朝北的房子厕所在什么方位最好? android 怎么读取数据库中的数据 使用android自带的日历控件怎么标记特定的 楼房卫生间位于房子的西北方向风水不好吗?能破解吗? android如何保存html文件,包括其中的图片。 卫生间在房子的西北角在风水上好吗 吃松仁有什么好处? Android创建数据库需要做哪些事情 请问卫生间在西北角或者卫生间在北面 但是西北角有... android 如何获取保存的图片的地址 并存到数据库中 厕所在..北面风水好吗 android怎么从数据库读取一条数据赋值给字符串 卫生间朝北风水好不好