关于安卓在共有目录保存数据库并加密

来源:互联网 发布:可可验证源码 编辑:程序博客网 时间:2024/05/17 08:34

注:安卓数据库的创建  data/data私有的目录是我们现阶段支持的 其余的路径虽然在安卓可以创建 但是这并不是值得推广的  因为出在数据泄露和.... 你懂得


SQLCipher + ......  3.1.0.zip   这个版本  自行去网上下载 使用2.2.2的版本 一直有一个异常  更换这个版本就可以使用了  有兴趣的可以试一试 


需要  ad   x86  v7a  三个     并且包括三个jar    一个asset文件    SQLiteDatabase.login(this);  
 将所有DataBase的包名更改成  net.datebase

清单文件中添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>


使用时的程序  activity中 
          SQLiteDatabase.loadLibs(context);
         DatabaseContext content = new DatabaseContext(context);
         helper = new MyDatabase(content);
         db = helper.getReadableDatabase("999");       //读取时的权限 
         db = helper.getWritableDatabase("999");       //写时的权限

        dao = new ScoreDao(context);
        scoreBean = dao.selectScores();




写一个类 继承SQLiteOpenHelper
public class MyDatabase extends SQLiteOpenHelper {

    private final String Table_Name = "Test";

    public MyDatabase(DatabaseContext context) {
        super(context, "gogogo.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String sql = " create table if not exists " + Table_Name
                + "(id integer primary key autoincrement,name varchar(30),age varchar(30))";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}



ScoreDao类  进行数据库的操作 

public class ScoreDao {
    private static final String TAG = "ScoreDao";
    private final String Table_Name = "Test";
    private MyDatabase myDatabase;

    public ScoreDao(Context context) {
        DatabaseContext dbContext = new DatabaseContext(context);
        myDatabase = new MyDatabase(dbContext);
    }

    public void add(String name,String age){
        SQLiteDatabase db = myDatabase.getWritableDatabase("999");
        db.execSQL("insert into Test values(null,?,?)", new Object[]{name,age});
        Log.d(TAG,"添加成功");
        db.close();
    }

    public void delete(String phonesn){
        SQLiteDatabase db = myDatabase.getWritableDatabase("999");
        db.execSQL("delete from Test where name = ?",new Object[]{name});
        db.close();
    }

    public void update(String name,String age){
        SQLiteDatabase db = myDatabase.getWritableDatabase("999");
        db.execSQL("update Test set age = ? where name = ?", new Object[]{name,age});
        Log.d(TAG,"添加成功");
        db.close();
    }

    public String find(String islogin){
        String phonesn = null;
        SQLiteDatabase db = myDatabase.getReadableDatabase("999");
        //cursor是一个结果集
        Cursor cursor = db.rawQuery("select phonesn from Test where name = ?", new String[]{name});
        boolean result = cursor.moveToNext();//判断是够有符合条件的元素
        if (result) {
            phonesn = cursor.getString(0);//获取第一列元素
        }
        cursor.close();
        db.close();
        return age;
    }

    public List<ScoreBean> selectScores(){
        //创建集合
        List<ScoreBean> scores=new ArrayList<ScoreBean>();
        //获取数据库操作实例
        SQLiteDatabase db=myDatabase.getReadableDatabase("999");
        //创建Cursor对象
        Cursor cursor=null;
        try {
            cursor = db.rawQuery("select * from Test",null);
            while(cursor.moveToNext()){
                String name=cursor.getString(cursor.getColumnIndex("name"));
                String age=cursor.getString(cursor.getColumnIndex("age"));

                //创建Person对象
                ScoreBean p = new ScoreBean(name,age);
                //将创建出来的ScoreBean对象添加到集合中去
                scores.add(p);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //关闭相应的资源
            if(cursor!=null){
                cursor.close();
            }
            if(db!=null){
                db.close();
            }
        }
        return scores;
    }
}




自己的上下文  可以将data/data目录下的数据库进行修改

public class DatabaseContext extends ContextWrapper {
    public DatabaseContext(Context context){
        super( context );
    }
    /**
     * 获得数据库路径,如果不存在,则创建对象对象
     * @param    name
     */
    @Override
    public File getDatabasePath(String name) {
        //判断是否存在sd卡
        boolean sdExist = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
        if(!sdExist){//如果不存在,
            return null;
        }else{//如果存在
            //获取sd卡路径
            String dbDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
            dbDir += "DB";//数据库所在目录
            String dbPath = dbDir+"/"+name;//数据库路径
            //判断目录是否存在,不存在则创建该目录
            File dirFile = new File(dbDir);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }
            //数据库文件是否创建成功
            boolean isFileCreateSuccess = false;
            //判断文件是否存在,不存在则创建该文件
            File dbFile = new File(dbPath);
            if(!dbFile.exists()){
                try {
                    isFileCreateSuccess = dbFile.createNewFile();//创建文件
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else{
                isFileCreateSuccess = true;
            }
            //返回数据库文件对象
            if(isFileCreateSuccess){
                return dbFile;
            }else{
                return null;
            }
        }
    }
    /**
     * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
     *
     * @param    name
     * @param    mode
     * @param    factory
     */
//    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name),"999",null);
        return result;
    }
    /**
     * Android 4.0会调用此方法获取数据库。
     *
     * @see ContextWrapper#openOrCreateDatabase(String, int,
     *              SQLiteDatabase.CursorFactory,
     *              DatabaseErrorHandler)
     * @param    name
     * @param    mode
     * @param    factory
     * @param     errorHandler
     */
//    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name),"999", null);
        return result;
    }
}
 

0 0
原创粉丝点击