1

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();
    }

これは私の活動で使用しているコードです

   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

4

2 に答える 2

1

コードを見ると、次のことがわかります。

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

}

アイデアは// TODO、データベースにデータを入力する実際のコードに置き換えることになっているということです。のドキュメントを読んでSQLiteOpenHelperこれを伝えることができます:

onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase, int, int)、およびオプションで onOpen(SQLiteDatabase) を実装するサブクラスを作成します。このクラスは、データベースが存在する場合はそれを開き、存在しない場合は作成し、必要に応じてアップグレードします。 . トランザクションは、データベースが常に適切な状態であることを確認するために使用されます。

次に、getReadableDatabase()およびgetWritableDatabase()メソッドを使用しSQLiteOpenHelperてデータベースにアクセスします。これらのメソッドの Android バージョンの SQLCipher の場合、パスフレーズをパラメーターとして渡します。

したがって、次のことをお勧めします。

  1. SQLiteDatabase.loadLibs(mContext);コンストラクターに移動します。

  2. の残りopenDataBase()とすべてを削除しclose()ます (そのコードは既に存在するため)

  3. 書き換えcheckDataBase()て無効なものを取り除き、代わりにDB_PATH使用するgetDatabasePath()

  4. db.execSQL(DATABASE_CREATE_TABLE1);に移動onCreate()

  5. 残りを削除createDataBase()

  6. SQLiteOpenHelperアクティビティで適切に使用する

于 2012-11-22T18:06:09.767 に答える
0

なぜあなたはサブクラス化していSQLiteOpenHelperますか?このクラスの目的は、データベース ファイルの管理、ファイルのオープン/クローズ、必要に応じたファイルの作成、およびアプリケーション データベース オブジェクトの管理です ( SQLiteDatabase)。

しかし、 SQLiteOpenHelper が何もしないことを意味する何もせずに、自分でそれを行っています。自分でデータベース ファイルを作成する場合は、SQLiteOpenHelper.onCreateサブクラス化しないでください。SQLiteOpenHelper

そのSQLiteDatabaseクラスは何ですか?公式loadLibsのメソッドにはメソッドも、渡しているパラメーターを受け入れる/オーバーロードもありません...openOrCreateDatabaseopenDatabase

于 2012-11-22T18:07:22.333 に答える