2012-12-13 70 views
0

当我尝试打开该资产的文件夹中的数据库与方法ErrorCopyingDataBase异常,当我尝试打开一个SQLite数据库

public void loadDatabase(String dbName){ 
    System.out.println("dbName"); 
    DataBaseAdapterNew mDbHelper = new DataBaseAdapterNew(
        this, dbName); 
      mDbHelper.createDatabase(); 
      mDbHelper.open(); 

    } 

我得到一个致命的异常ErrorCopyingDataBase

错误堆栈

12-13 18:21:29.179: E/AndroidRuntime(10230): FATAL EXCEPTION: main 
12-13 18:21:29.179: E/AndroidRuntime(10230): java.lang.Error: ErrorCopyingDataBase 
12-13 18:21:29.179: E/AndroidRuntime(10230): at com.my.app.db.DataBaseHelper.createDataBase(DataBaseHelper.java:43) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at com.my.app.db.DataBaseAdapterNew.createDatabase(DataBaseAdapterNew.java:42) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at com.my.app.MyActivity.loadDatabase(MyActivity.java:133) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at com.my.app.MyActivity$InvocazioneAsincrona$1.run(MyActivity.java:173) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at android.os.Handler.handleCallback(Handler.java:587) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at android.os.Looper.loop(Looper.java:130) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at android.app.ActivityThread.main(ActivityThread.java:3687) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at java.lang.reflect.Method.invokeNative(Native Method) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at java.lang.reflect.Method.invoke(Method.java:507) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
12-13 18:21:29.179: E/AndroidRuntime(10230): at dalvik.system.NativeStart.main(Native Method) 

我的DatabaseAdapterNew类是:

public class DataBaseAdapterNew { 

    protected static final String TAG = "DataAdapter"; 

    private final Context mContext; 
    private SQLiteDatabase mDb; 
    private DataBaseHelper mDbHelper; 

    public DataBaseAdapterNew(Context context, String nameDB) { 
     this.mContext = context; 
     mDbHelper = new DataBaseHelper(mContext, nameDB); 
    } 

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

    public DataBaseAdapterNew open() throws SQLException { 
     try { 
      mDbHelper.openDataBase(); 
      mDbHelper.close(); 
      mDb = mDbHelper.getReadableDatabase(); 
     } catch (SQLException mSQLException) { 
      Log.e(TAG, "open >>" + mSQLException.toString()); 
      throw mSQLException; 
     } 
     return this; 
    } 

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

    public Cursor allData() { 
     try { 
      Cursor c = mDb.rawQuery(
        "SELECT * FROM myTable order by Quantity desc", null); 
      if (c != null) { 
       c.moveToNext(); 
      } 
      return c; 
     } catch (SQLException mSQLException) { 
      Log.e(TAG, "allData >>" + mSQLException.toString()); 
      throw mSQLException; 
     } 

    } 



    } 

我DatabaseHelper类是:

public class DataBaseHelper extends SQLiteOpenHelper { 
    private static String TAG = "DataBaseHelper"; 
    private static String DB_PATH = ""; 
    private static String DB_NAME = ""; 
    private SQLiteDatabase mDataBase; 
    private final Context mContext; 

    public DataBaseHelper(Context context, String nomeDB) { 
     super(context, nomeDB, null, 1);// 1? its Database Version 
     DB_NAME = nomeDB; 
     DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
     this.mContext = context; 
    } 

    public void createDataBase() throws IOException { 
     // If database not exists copy it from the assets 

     boolean mDataBaseExist = checkDataBase(); 
     if (!mDataBaseExist) { 
      this.getReadableDatabase(); 
      this.close(); 
      try { 
       // Copia il database dalla cartella assests 
       copyDataBase(); 
       Log.e(TAG, "createDatabase database created"); 
      } catch (IOException mIOException) { 
       throw new Error("ErrorCopyingDataBase"); 
      } 
     } 
    } 

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

    private void copyDataBase() throws IOException { 
     InputStream mInput = mContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream mOutput = new FileOutputStream(outFileName); 
     byte[] mBuffer = new byte[1024]; 
     int mLength; 
     while ((mLength = mInput.read(mBuffer)) > 0) { 
      mOutput.write(mBuffer, 0, mLength); 
     } 
     mOutput.flush(); 
     mOutput.close(); 
     mInput.close(); 
    } 

    public boolean openDataBase() throws SQLException { 
     String mPath = DB_PATH + DB_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(mPath, null, 
       SQLiteDatabase.CREATE_IF_NECESSARY); 
     return mDataBase != null; 
    } 

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

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

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 

} 

传递的字符串DBNAME显示存在于资产的println文件夹中的DB的正确名称,该数据库是非零和预编译,所以我无法弄清楚错误的原因。 有什么建议吗?

回答

1

我将你的代码复制到我的项目中,并且它能正常工作。

在loadDatabase(),

System.out.println("dbName"); 

将始终打印字DBNAME。我不确定这是否是资产文件夹中数据库的名称;因为我看不到你对loadDatabase(dbName)的调用,所以我不知道你使用的是什么值。

这是我如何调用你的代码,直接从我的应用程序:

String dbName = "itr"; 
    System.out.println(dbName); 
    DataBaseAdapterNew mDbHelper = new DataBaseAdapterNew(
        this, dbName); 
      mDbHelper.createDatabase(); 
      mDbHelper.open(); 

在DatabaseHelper.createDataBase(),你是隐藏的错误条件。如果你想看到什么异常原因造成的问题,我建议

public void createDataBase() throws IOException { 
    // If database not exists copy it from the assets 

    boolean mDataBaseExist = checkDataBase(); 
    if (!mDataBaseExist) { 
     this.getReadableDatabase(); 
     this.close(); 
     try { 
      // Copia il database dalla cartella assests 
      copyDataBase(); 
      Log.e(TAG, "createDatabase database created"); 
     } catch (IOException mIOException) { 
      Log.e(TAG, mIOException.toString()); 
      throw mIOException; 
     } 
    } 
} 

印刷在例外

java.io.FileNotFoundException:ITR UnableToCreateDatabase

我复制过来的现有的数据库到/ assets/itr和我的数据库被正确创建。

+1

感谢您的帮助,因为一些奇怪的原因似乎在字符串中有一些空白导致文件没有发现异常,我已修复与修剪 – AndreaF

相关问题