0

我想检查数据库是否存在。如果不存在,我会将文件复制到特定路径。这里的代码如下:

主.java

   UserDbAdapter objChatMessageDbAdapter = new UserDbAdapter();
   objChatMessageDbAdapter.context = context;
   User objChatMessage = objChatMessageDbAdapter.getUser();

   if(objChatMessage.getID()<1){

        //call register intent
   }else{
        // call the first intent
   }

用户数据库适配器.java

    private SQLiteDatabase db;
    private static String TABLE_USER = "User";
    private boolean isDbClosed =true;
    public Context context;
    String TAG = "UserDbAdapter";

    public UserDbAdapter() { }

    public void init(Context context) {

      if(isDbClosed){
        DatabaseAdapter dbAdapter = DatabaseAdapter.getInstance(context);
        isDbClosed =false;
        db = dbAdapter.getWritableDatabase();
      }     

      this.context = context;
    }

    private void processConnection()
    {
      Log.i(TAG, "isDbClosed==="+isDbClosed);
      if(isDbClosed){
        DatabaseAdapter dbAdapter = new DatabaseAdapter(context);
        dbAdapter = DatabaseAdapter.getInstance(context);
        isDbClosed =false;
        db = dbAdapter.getWritableDatabase();
        Log.i(TAG, "processConnection db===="+db.toString());
       }     
   }

   public boolean isDatabaseClosed(){
     return isDbClosed;
   }

   public User getUser()
   {

            processConnection();
            User objChatMessageEntity = new User();
            String selectQuery = "Select UserId, Name, Password FROM "+TABLE_USER;  
            Cursor cursor = db.rawQuery(selectQuery, null);
            // looping through all rows and adding to list 
            if (cursor.moveToFirst()) {                              
            objChatMessageEntity = fieldMappingForGetRecord(cursor);

             }
             cursor.close();
             db.close();
             isDbClosed =true;
             return objChatMessageEntity;
   }
}

数据库适配器.java

private static String dbPath;
private static String dbName = "ownexpensesdb"; 
private SQLiteDatabase applicationDatabase;  
public final Context applicationContext;
private static DatabaseAdapter mInstance = null;
private static final int DATABASE_VERSION = 1;


public static DatabaseAdapter getInstance(Context ctx) { 

    if (mInstance == null) { 
        dbPath = "/data/data/" + ctx.getPackageName() + "/databases/";
        mInstance = new DatabaseAdapter(ctx.getApplicationContext()); 
    } 
    return mInstance; 
}

public DatabaseAdapter(Context context) {    
    super(context,  dbName , null, DATABASE_VERSION);
    this.applicationContext  = context;

    boolean  dbExist = checkDataBase();
    //SQLiteDatabase db_Read = null;
    if (dbExist){
       Log.w("Database","file found ");
       openDataBase();
    }
    else
    {
        Log.w("Database","file not found ");
        this.getReadableDatabase(); 
        try 
        {
            copyDatabase();
        } 
        catch (IOException e) 
        {
            Log.e("Error",""+e.getMessage());
            e.printStackTrace();
        } 
   }
}


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

private void copyDatabase() throws IOException
{  
    InputStream input =  applicationContext.getAssets().open(dbName);
     String outPutFileName=  dbPath  +  dbName ;
     OutputStream output = new FileOutputStream( outPutFileName); 
    byte[] buffer = new byte[1024];
    int length;
    while ((length = input.read(buffer))>0){
     output.write(buffer, 0, length);
    }
    output.flush();
    output.close();
    input.close();
}


   public void openDataBase() throws SQLException
   {
        String fullDbPath= dbPath + dbName;
        Log.w("Database","open DB");
        try
        {
            applicationDatabase = SQLiteDatabase.openDatabase( fullDbPath, null,SQLiteDatabase.OPEN_READONLY);
        }
        catch (Exception e) {
            Log.e("error",e.toString());
        }
   }

  @Override
    public synchronized void close() {
         if( applicationDatabase != null)
           applicationDatabase .close();
               super.close();
  }
  @Override
  public void onCreate(SQLiteDatabase db) {
  }

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

01:10.880:W/System.err(9975):引起:libcore.io.ErrnoException:打开失败:EROFS(只读文件系统)08-28 11:01:10.885:W/System.err(9975) : 在 libcore.io.Posix.open(Native Method) 08-28 11:01:10.885: W/System.err(9975): 在 libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 08-28 11 :01:10.885: W/System.err(9975): 在 libcore.io.IoBridge.open(IoBridge.java:400) 08-28 11:01:10.885: W/System.err(9975): ... 19 更多 08-28 11:01:10.885: W/Database(9975): 找到文件 08-28 11:01:10.885: W/Database(9975): 打开 DB 08-28 11:01:10.895: I/UserDbAdapter (9975):processConnection db====SQLiteDatabase:/data/data/com.canmmy.expensesmanager/databases/ownexpensesdb 08-28 11:01:10.895:I/sqlite-select 查询(9975):选择用户 ID,名称,来自用户的密码;08-28 11:01:10.895: E/SQLiteLog(9975): (1) 没有这样的表: 用户 08-28 11:01:10.895: D / AndroidRuntime(9975):关闭VM 08-28 11:01:10.895:W / dalvikvm(9975):threadid = 1:线程退出但未捕获异常(组= 0x410502a0)08-28 11:01:10.900:E /AndroidRuntime(9975): FATAL EXCEPTION: main 08-28 11:01:10.900: E/AndroidRuntime(9975): android.database.sqlite.SQLiteException: no such table: User (code 1): , while compile: Select UserId ,姓名,密码来自用户;08-28 11:01:10.900: E/AndroidRuntime(9975): 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 08-28 11:01:10.900: E/AndroidRuntime(9975): 在 android.database .sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1011) 08-28 11:01:10.900: E/AndroidRuntime(9975): 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:622) 08-28 11 :01:10.900:E / AndroidRuntime(9975):在android。

4

1 回答 1

0

以下代码适用于我。我将数据库放在资产文件夹中。

您唯一需要注意的是,如果您更改资产文件夹中的数据库,您必须先使用 adb uninstall yourpackagename 卸载应用程序,否则应用程序将更新但数据库不会。我花了一点时间才弄清楚这一点。希望这可以帮助。

注意:TDAdb 是一种定义与数据库一起使用的变量的方法。在这种情况下,TDAdb.onCreate 和 TDAdb.onUpdate 不必做任何事情。

    public class TDAdbHelper extends SQLiteOpenHelper {

public static String DATABASE_PATH;
public static final String DATABASE_NAME = "tda.db";
private static final int DATABASE_VERSION = 1;
private Context context;
private SQLiteDatabase db;

public TDAdbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = context;
    String packageName = context.getPackageName();
    DATABASE_PATH = String.format(context.getString(R.string.str_databasepath),
            packageName);
    openDataBase();
}

@Override
public void onCreate(SQLiteDatabase db) {
    TDAdb.onCreate(db);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    TDAdb.onUpgrade(db, oldVersion, newVersion);
}

// Performing a database existence check
private boolean checkDataBase() {
    SQLiteDatabase checkDb = null;
    try {
        String path = DATABASE_PATH + DATABASE_NAME;
        checkDb = SQLiteDatabase.openDatabase(path, null,
                SQLiteDatabase.OPEN_READONLY);
    } catch (SQLException e) {
        Log.e(this.getClass().toString(), context.getString(R.string.str_error_while_checking_db));
    }

    if (checkDb != null) {
        checkDb.close();
    }
    return checkDb != null;
}

// Method for copying the database
private void copyDataBase() throws IOException {
    //Log.i(this.getClass().toString(), "... in copyDataBase ");
    InputStream externalDbStream = context.getAssets().open(DATABASE_NAME);

    String outFileName = DATABASE_PATH + DATABASE_NAME;

    OutputStream localDbStream = new FileOutputStream(outFileName);

    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = externalDbStream.read(buffer)) > 0) {
        localDbStream.write(buffer, 0, bytesRead);
    }

    localDbStream.close();
    externalDbStream.close();
}

public void createDataBase() {
    //Log.i(this.getClass().toString(), "... in createDataBase ");
    boolean dbExist = checkDataBase();
    if (!dbExist) {
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            Log.e(this.getClass().toString(), context.getString(R.string.str_copying_error));
            throw new Error(context.getString(R.string.str_error_copying_database_exclamation));
        }
    } else {
        //Log.i(this.getClass().toString(), "Database already exists");
    }
}

public SQLiteDatabase openDataBase() throws SQLException {
    String path = DATABASE_PATH + DATABASE_NAME;
    // Log.i(this.getClass().toString(), "Starting openDatabase " + path);
    if (db == null) {
        createDataBase();
        db = SQLiteDatabase.openDatabase(path, null,
                SQLiteDatabase.OPEN_READWRITE);
    }

    return db;
}

}

祝你有美好的一天。

于 2013-08-28T04:14:27.657 回答