gpt4 book ai didi

java - 在 android 中的 sdCard 上创建 SQLCiphered 数据库时出错

转载 作者:行者123 更新时间:2023-11-30 03:54:49 25 4
gpt4 key购买 nike

我正在尝试在 sdCard 中创建一个 sqlCipher 加密数据库,然后从那里读取并存储值。

这是我的代码。

public class DataBaseHelper extends SQLiteOpenHelper 
{
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
private static String DB_PATH ;//path of our database
private static String DB_NAME = "application-database";// Database name
private static int DATABASE_VERSION = 1;

private SQLiteDatabase mDataBase;
private final Context mContext;

private static final String DATABASE_CREATE_TABLE1 =
"create table notes (_id integer primary key autoincrement, myval);";


public DataBaseHelper(Context context)
{
super(context, DB_NAME, null, DATABASE_VERSION );
this.mContext = context;
DB_PATH = Environment.getExternalStorageDirectory() + "/Personal Folder/";
}

public void createDataBase() throws IOException
{
//If database not exists create it from the assets
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
try
{
File dbFile = new File(DB_PATH + DB_NAME);
SQLiteDatabase.loadLibs(mContext);
dbFile.mkdirs();
dbFile.delete();
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, "setPassword", null);
db.execSQL(DATABASE_CREATE_TABLE1);
Log.e(TAG, "createDatabase database created");
}
catch (SQLException mIOException)
{
throw new Error("Error Creating Database");
}
}
}

private boolean checkDataBase()
{
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}

//Open the database, so we can query it
public boolean openDataBase() throws SQLException
{
String mPath = DB_PATH + DB_NAME;
SQLiteDatabase.loadLibs(mContext);
mDataBase = SQLiteDatabase.openDatabase(mPath, "setPassword", null, SQLiteDatabase.CREATE_IF_NECESSARY);
return mDataBase != null;
}

@Override
public synchronized void close()
{
if(mDataBase != null)
mDataBase.close();
super.close();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data");

/*
if (oldVersion == 2)
{
db.execSQL("ALTER TABLE notes ADD " + KEY_DATA + " blog");
db.execSQL("ALTER TABLE notes ADD " + KEY_TYPE + " text");

}

if (newVersion == 3)
{
db.execSQL("ALTER TABLE notes ADD " + KEY_TYPE + " text");
}
*/
}

@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub

}

}


public class PADatabaseAdapter
{
private static final String TAG = "DbAdapter";
private final Context mContext;
private DataBaseHelper mDbHelper;
private SQLiteDatabase mDb;

/**
* Database creation sql statement
*/
public PADatabaseAdapter(Context ctx)
{
this.mContext = ctx;
mDbHelper = new DataBaseHelper(mContext);
}

public PADatabaseAdapter createDatabase() throws SQLException
{
try
{
mDbHelper.createDataBase();
}
catch (IOException mIOException)
{
Log.e(TAG, mIOException.toString() + " UnableToCreateDatabase");
throw new Error("UnableToCreateDatabase");
}
return this;
}

public PADatabaseAdapter open(String password) throws SQLException
{
try
{
mDbHelper.openDataBase(password);
//mDbHelper.close();
mDb = mDbHelper.getmDataBase();
// mDbHelper.getWritableDatabase(password);

}
catch (SQLException mSQLException)
{
Log.e(TAG, "open >>"+ mSQLException.toString());
throw mSQLException;
}
System.gc();
return this;
}

public boolean isOpen ()
{
if (mDb !=null)
return mDb.isOpen();
else
return false;
}

public void rekey (String password)
{
mDb.execSQL("PRAGMA rekey = '" + password + "'");
System.gc();
}

public void close()
{
mDb.close();
mDbHelper.close();
}

这是我在 Activity 中使用的代码

   mContext = this;
mDbHelper = new PADatabaseAdapter(this);
mDbHelper.createDatabase();

mDbHelper.open("setPassword");
long as = mDbHelper.createNote("abc");
mDbHelper.close();

mDbHelper.open("setPassword");
Cursor mCursor = mDbHelper.fetchAllNotes();
mDbHelper.close();

问题是,在 db.exec(CREATE_tABLE) 中,它要么没有创建表,要么有其他错误,因为 long as = mDbHelper.createNote("abc"); 给出错误 no such table notes

最佳答案

如果您查看您的代码,您将看到:

@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub

}

想法是您应该用填充数据库的实际代码替换 //TODO。你可以告诉这个reading the documentation for SQLiteOpenHelper :

You create a subclass implementing onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

然后,您可以在 SQLiteOpenHelper 上使用 getReadableDatabase()getWritableDatabase() 方法来访问您的数据库。对于这些方法的 Android 版本的 SQLCipher,您将密码短语作为参数传递。

因此,我建议您:

  1. SQLiteDatabase.loadLibs(mContext); 移动到您的构造函数。

  2. 删除 openDataBase() 的其余部分,以及所有 close()(因为该代码已经存在)

  3. 重写 checkDataBase() 以去除无效的 DB_PATHuse getDatabasePath() instead

  4. db.execSQL(DATABASE_CREATE_TABLE1); 移动到 onCreate()

  5. 删除剩余的createDataBase()

  6. 在您的 Activity 中正确使用SQLiteOpenHelper

关于java - 在 android 中的 sdCard 上创建 SQLCiphered 数据库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com