3

我正在努力解决如何使用 SQLCipher 加密/解密数据库。

在我的这段代码中,我应该从哪里开始。以及如何开始。

如果可能,请编辑此代码。

我关注了这个链接,但没有得到如何做到这一点。http://sqlcipher.net/sqlcipher-api/#key

我的数据库文件:-

import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.Context;
import android.util.Log;

public class DatabaseClass extends SQLiteOpenHelper 
{
    /**
     * Constants 
     */
    public final static String DATABASE_NAME ="mycipherdatabase.db";
    public final static String NAME ="name";
    public final static String ADDRESS ="address";
    public final static String CITY ="city";

    public static String pass = "1234";
    public DatabaseClass(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    /**
     * called once
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL( "CREATE TABLE mylistdata(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, address TEXT,city TEXT);");

        Log.v("inside", "oncreate");
    }

    /**
     * called when we upgrade(change)the version number of database
     * onCreate also called after changing the version
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP Table mylistdata");
        onCreate(db);
    }
}

使用此数据库的其他活动:-

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SQLiteDatabase.loadLibs(this);
        File file = getDatabasePath(DatabaseClass.DATABASE_NAME);
        file.mkdir();
        file.delete();
        sqldb = SQLiteDatabase.openOrCreateDatabase(file,key, null);
        db = new DatabaseClass(this);

        etname = (EditText)findViewById(R.id.name);
        etadd = (EditText)findViewById(R.id.add);
        etcity = (EditText)findViewById(R.id.city);
        result = (ListView)findViewById(R.id.mylist);
    }

    /**
     *insert data in to database 
     */
    public void saveData(View v) {
        ContentValues insertData = new ContentValues();
        insertData.put(DatabaseClass.NAME, etname.getText().toString());
        insertData.put(DatabaseClass.ADDRESS, etadd.getText().toString());
        insertData.put(DatabaseClass.CITY, etcity.getText().toString());

        db.getWritableDatabase(key).insert("mylistdata", DatabaseClass.NAME , insertData);
        db.close();

        resetEditText();
        Toast.makeText(this,"Data saved", Toast.LENGTH_SHORT).show();
    }
4

3 回答 3

4

好吧,代码有这么多问题,我想你必须更好地了解 android 中的 SQLite 结构,从技术上讲,Android SQLiteSQLCipher看起来完全一样(除了密码)。因此,如果您编写标准 SQLite 应用程序,可以轻松将其更改为 SQLCipher,

我建议你阅读这篇关于 Android 中 SQLite 的精彩文章,

http://www.vogella.com/articles/AndroidSQLite/article.html

提示:使用SQLiteOpenHelper时无需调用openOrCreateDatabase,调用getWritableDatabase就可以完成这项工作,而且您必须拥有一个从getWritableDatabase方法获取的SQLiteDatabase对象,每次要插入记录时都调用getWritableDatabase不是正确的。

这些部分将被移除,

     // in onCreate method
     File file = getDatabasePath(DatabaseClass.DATABASE_NAME);
     file.mkdir();
     file.delete();
     sqldb = SQLiteDatabase.openOrCreateDatabase(file,key, null);
     db = new DatabaseClass(this);

     // in saveData method
      db.getWritableDatabase(key).insert("mylistdata", DatabaseClass.NAME ,               insertData);

相反,你必须做这样的事情

     // in onCreate method
     try{
        sqldb = new DatabaseClass(this).getWritableDatabase(key);
     }catch(Throwable e){
        // error occurred
     }

     // in insert action
     try{
        sqldb.insert("tablename", null, contentValues);
     }catch(Throwable e){
        // error occurred
     }

这样您还可以查看是否发生错误,记住,不要在流行语上使用Exception类,只有Throwable

另外,我不建议在每次插入操作时关闭连接,最好在更高级别进行处理

于 2013-04-15T13:13:57.803 回答
1

尝试使用这里描述的 SQLiteDatabase.openOrCreateDatabase:http: //sqlcipher.net/sqlcipher-for-android/

于 2013-01-29T14:36:02.203 回答
0

这可能是一个很好的起点, https://guardianproject.info/code/sqlcipher/

更多来自 Android 文档, http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onConfigure(android.database.sqlite.SQLiteDatabase)

对我来说,关键点是将 sqlcipher jar 添加到您的 android deps 中,并确保您设置了密钥/密码短语 PRAGMA stmts。

于 2013-01-29T12:21:43.180 回答