2011-09-21 4 views
0

나는 SQLite 데이터베이스를 사용하는 응용 프로그램에서 일하고 있어요. 나는 두 개의 다른 sqlite 데이터베이스를 생성하고 assets 폴더에서 복사하는 사용자 정의 DatabaseHelper 클래스를 가지고 있습니다. 내가 가질 수있는 문제는 나는 두 개의 데이터베이스가안드로이드 데이터베이스를 변경

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DataBaseHelper extends SQLiteOpenHelper{ 

    private static SQLiteDatabase sqliteDb; 
    private static DataBaseHelper instance; 
    private static final int DATABASE_VERSION = 1; 
    // the default database path is : 
    // /data/data/pkgNameOfYourApplication/databases/ 
    private static String DB_PATH_PREFIX = "/data/data/"; 
    private static String DB_PATH_SUFFIX = "/databases/"; 
    private static final String TAG = "DataBaseHelper"; 
    private Context context; 

    /*** 
    * Contructor 
    * 
    * @param context 
    *   : app context 
    * @param name 
    *   : database name 
    * @param factory 
    *   : cursor Factory 
    * @param version 
    *   : DB version 
    */ 
    public DataBaseHelper(Context context, String name, 
        CursorFactory factory, int version) { 
      super(context, name, factory, version); 
      this.context = context; 
      Log.i(TAG, "Create or Open database : " + name); 
    } 

    /*** 
    * Initialize method 
    * 
    * @param context 
    *   : application context 
    * @param databaseName 
    *   : database name 
    */ 
    public static void initialize(Context context, String databaseName) { 
      if (instance == null) { 
        /** 
        * Try to check if there is an Original copy of DB in asset 
        * Directory 
        */ 
        if (!checkDatabase(context, databaseName)) { 
          // if not exists, I try to copy from asset dir 
          try { 
           copyDataBase(context, databaseName); 
          } catch (IOException e) { 
            Log.e(TAG,"Database "+ databaseName+" does not exists and there is no Original Version in Asset dir"); 
          } 
        } 

        Log.i(TAG, "Try to create instance of database (" + databaseName 
            + ")"); 
        instance = new DataBaseHelper(context, databaseName, 
            null, DATABASE_VERSION); 
        sqliteDb = instance.getWritableDatabase(); 
        Log.i(TAG, "instance of database (" + databaseName + ") created !"); 
      } 
    } 

    /*** 
    * Static method for getting singleton instance 
    * 
    * @param context 
    *   : application context 
    * @param databaseName 
    *   : database name 
    * @return : singleton instance 
    */ 
    public static final DataBaseHelper getInstance(
        Context context, String databaseName) { 
      initialize(context, databaseName); 
      return instance; 
    } 

    /*** 
    * Method to get database instance 
    * 
    * @return database instance 
    */ 
    public SQLiteDatabase getDatabase() { 
      return sqliteDb; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
      Log.d(TAG, "onCreate : nothing to do"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.d(TAG, "onUpgrade : nothing to do"); 

    } 

    /*** 
    * Method for Copy the database from asset directory to application's data 
    * directory 
    * 
    * @param databaseName 
    *   : database name 
    * @throws IOException 
    *    : exception if file does not exists 
    */ 
    public void copyDataBase(String databaseName) throws IOException { 
      copyDataBase(context, databaseName); 
    } 

    /*** 
    * Static method for copy the database from asset directory to application's 
    * data directory 
    * 
    * @param aContext 
    *   : application context 
    * @param databaseName 
    *   : database name 
    * @throws IOException 
    *    : exception if file does not exists 
    */ 
    private static void copyDataBase(Context aContext, String databaseName) 
        throws IOException { 

      // Open your local db as the input stream 
      InputStream myInput = aContext.getAssets().open(databaseName); 

      // Path to the just created empty db 
      String outFileName = getDatabasePath(aContext, databaseName); 

      Log.i(TAG, "Check if create dir : " + DB_PATH_PREFIX 
          + aContext.getPackageName() + DB_PATH_SUFFIX); 

      // if the path doesn't exist first, create it 
      File f = new File(DB_PATH_PREFIX + aContext.getPackageName() 
          + DB_PATH_SUFFIX); 
      if (!f.exists()) 
        f.mkdir(); 

      Log.i(TAG, "Trying to copy local DB to : " + outFileName); 

      // Open the empty db as the output stream 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      // transfer bytes from the inputfile to the outputfile 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = myInput.read(buffer)) > 0) { 
        myOutput.write(buffer, 0, length); 
      } 

      // Close the streams 
      myOutput.flush(); 
      myOutput.close(); 
      myInput.close(); 

      Log.i(TAG, "DB (" + databaseName + ") copied!"); 
    } 

    /*** 
    * Method to check if database exists in application's data directory 
    * 
    * @param databaseName 
    *   : database name 
    * @return : boolean (true if exists) 
    */ 
    public boolean checkDatabase(String databaseName) { 
      return checkDatabase(context, databaseName); 
    } 

    /*** 
    * Static Method to check if database exists in application's data directory 
    * 
    * @param aContext 
    *   : application context 
    * @param databaseName 
    *   : database name 
    * @return : boolean (true if exists) 
    */ 
    private static boolean checkDatabase(Context aContext, String databaseName) { 
      SQLiteDatabase checkDB = null; 

      try { 
        String myPath = getDatabasePath(aContext, databaseName); 

        Log.i(TAG, "Trying to conntect to : " + myPath); 
        checkDB = SQLiteDatabase.openDatabase(myPath, null, 
            SQLiteDatabase.OPEN_READONLY); 
        Log.i(TAG, "Database " + databaseName + " found!"); 
        checkDB.close(); 
      } catch (SQLiteException e) { 
        Log.i(TAG, "Database " + databaseName + " does not exists!"); 

      } 

      return checkDB != null ? true : false; 
    } 

    /*** 
    * Method that returns database path in the application's data directory 
    * 
    * @param databaseName 
    *   : database name 
    * @return : complete path 
    */ 
    @SuppressWarnings("unused") 
    private String getDatabasePath(final String databaseName) { 
      return getDatabasePath(context, databaseName); 
    } 

    /*** 
    * Static Method that returns database path in the application's data 
    * directory 
    * 
    * @param aContext 
    *   : application context 
    * @param databaseName 
    *   : database name 
    * @return : complete path 
    */ 
    private static String getDatabasePath(Context aContext, String databaseName) { 
      return DB_PATH_PREFIX + aContext.getPackageName() + DB_PATH_SUFFIX 
          + databaseName; 
    } 

    public boolean executeQuery(String tableName,ContentValues values){ 
     return execQuery(tableName,values); 
    } 

    private static boolean execQuery(String tableName,ContentValues values){ 
     sqliteDb = instance.getWritableDatabase(); 
     sqliteDb.insert(tableName, null, values); 
     return true; 
    } 

    public boolean updateSQL(String tableName,String key,String value){ 
     return updateData(tableName,key,value); 
    } 

    private static boolean updateData(String tableName,String key,String value){ 
     sqliteDb = instance.getWritableDatabase(); 
     String where = ""; 
     ContentValues values = new ContentValues(); 
     values.put(key, value); 
     values.put(key, value); 
     sqliteDb.update(tableName, values, where, new String[] {"3"}); 
     return true; 
    } 

    public boolean deleteSQL(String tableName){ 
     return deleteData(tableName); 
    } 

    private static boolean deleteData(String tableName){ 
     sqliteDb = instance.getWritableDatabase(); 
     String where = ""; 
     sqliteDb.delete(tableName, where, new String[] {"5"}); 
     return true; 
    } 

    public Cursor executeSQLQuery(String query){ 
     return sqliteDb.rawQuery(query,null); 
    } 


    /** 
    * Make queries 
    * 
    */ 
} 

: 첫 번째는 두 번째 user.sqlitesystem.sqlite하고 데이터베이스가 다른 situations.Here에서 사용할 수있는 't 세트처럼 내 DatabaseHelper 클래스는 모습입니다. 내 응용 프로그램이 시작될 때 나는 첫 번째 초기화 해요 : 나는 사용자의 데이터베이스 같은 방식으로, 내 응용 프로그램에서 사용자가 처음 로그인을 초기화하고있어

dbHelper = new DataBaseHelper(this, "system.sqlite", null, 1); 
DataBaseHelper.initialize(this, "system.sqlite"); 
dbHelper.checkDatabase("system.sqlite"); 

. 로그인 후 은 내가 dB의 양쪽에서 일부 데이터를 삽입 할 필요가 몇 비 활동 수업이 있습니다

ContentValues values = new ContentValues(); 
values.put("objectId", 75); 
values.put("objectOid", "boom"); 
values.put("serverName", "shit"); 
values.put("locale", "en_US"); 
values.put("deviceId", 45); 
dbHelper.executeQuery("users",values); 

을하지만 문제는 주변에 비해 첫 번째 클래스의 경우에도 개방 내 system.sqlite 그것은 .. 그리고 그것은 여전히 ​​시스템 db에 쓰려고 다른 클래스에서 user.sqlite를 열려고합니다. 예 :

dbHelper = new DataBaseHelper(context, "system.sqlite", null, 1); 
dbHelper.initialize(context, "system.sqlite"); 
dbHelper.getWritableDatabase(); 
//do some work 
dbHelper.close(); 

실제로 작동하지 않습니다. 제안 사항 어떻게하면 일을 시작할 수 있습니까?

답변

1

별도의 DataBaseHelper 클래스가없는 이유는 무엇입니까? UserDataBaseHelper 및 SystemDataBaseHelper와 같은. 나는 이것이 단순하게 들리지만, 두 개의 데이터베이스가있는 더 큰 프로젝트를 가지고 있다면 모든 db 접근을 하나의 클래스로 덩어리로 만들겠습니까?

0

DataBaseHelper 클래스에는 정적 필드가 많이 있는데, 특히 instance입니다. 예를 들어 initializeexecQuery 메쏘드에서 액세스 할 수 있습니다. 데이터베이스가 두 개 이상 있기 때문에 DataBaseHelper에있는 모든 싱글 톤 코드를 제거하고 수정했는지 확인하는 것이 좋습니다.

+0

정적 필드를 모두 제거하면이 줄에서 예외가 발생합니다. return sqliteDb.rawQuery (query, null); –

+0

또한 정적 필드를 참조하는 코드를 수정해야합니다. –

+0

지금이 줄에 붙어 있습니다 : return DB_PATH_PREFIX + aContext.getPackageName() + DB_PATH_SUFFIX + databaseName; --- 어떤 NullPointerException 던지고있다. –

관련 문제