2011-07-27 50 views
0

我必須爲一個應用程序設置2個數據庫。我做了&在emulator.MemSDKVersion工作正常:8真正的手機版本是:2.2.1。 IT支持。當我在真正的手機中設置數據庫時,我無法設置。總是我無法創建DB.I認爲一個根源是一個,因爲當我去文件探索 - >數據。我無法打開數據文件夾。真正的HTC手機Android的sqlite數據庫複製錯誤

我對apk有疑問,因爲我的應用程序大小是8 MB。它包含資產文件夾中的數據庫。這個大小是4.65 MB。但apk文件大小是1.14MB。

它將如何從資產文件夾中讀取(在真實手機中)?

我真的不知道這是錯的還是正確的..這些是我的疑問。請解釋我。

我得到這個錯誤:

enter image description here 請幫助我。

我的編碼部分或其他東西是否有錯誤?

請幫幫我。

在此先感謝....

編輯

這是我copyDatabase代碼:

公共類DataBaseMasterHelper擴展SQLiteOpenHelper {

// The Android's default system path of your application database. 
private static String DB_PATH = "/data/data/com.android.xont.controller/databases/"; 
private static String DB_NAME = "MasterUserVentura_HEMA.db"; 
private SQLiteDatabase ventura; 
private Context myContext; 
private DataBaseHelper myDbHelper; 

public DataBaseMasterHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
} 

/** 
* Creates a empty database on the system and rewrites it with your own 
* database. 
**/ 
public void createDataBase() throws IOException { 

    boolean dbExist = checkDataBase(); 
    File Path = myContext.getDir("Data", 0); 
    File DBFile = new File(Path, DB_NAME); 
    System.out.println("-------" + DB_NAME); 
    if(!DBFile.exists()) //Need to copy... 
     copyDataBase(myContext, DBFile); 

} 

public boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
     e.printStackTrace(); 
    } 

    if (checkDB != null) { 
     checkDB.close(); 
    } 

    return checkDB != null ? true : false; 
} 

private void copyDataBase(Context Ctxt, File DBFile) throws IOException { 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 


} 

public void openDataBase() throws SQLException { 
    String myPath = DB_PATH + DB_NAME; 
    ventura = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READONLY); 

} 

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

,並呼籲像這樣:

MyGrid.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView parent, View v, int position,long id) { 

      if (position == 0) { 
       try { 
        myDbMasterHelper.createDataBase(); 
        Toast.makeText(DatabaseSetupActivity.this, "Successfully copied database",Toast.LENGTH_SHORT).show(); 
       } catch (IOException ioe) { 
        Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show(); 
        ioe.printStackTrace(); 
       }catch (Exception ioe) { 
        Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show(); 
        ioe.printStackTrace(); 
       } 


      }else if (position == 1) { 
       try { 
        myDbHelper.createDataBase(); 
        Toast.makeText(DatabaseSetupActivity.this, "Successfully copied database",Toast.LENGTH_SHORT).show(); 
       } catch (IOException ioe) { 
        Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show(); 
        ioe.printStackTrace(); 

       }catch (Exception ioe) { 
        Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show(); 
        ioe.printStackTrace(); 
       } 



      } 
     } 
    }); 

工作正常的模擬器。如果文件大小有問題,那麼在仿真器中也應該得到錯誤呢?

我有錯誤是這樣的:)

java.io.FileNotFoundException: /data/data/com.android.xont.controller/databases /MasterUserVentura_HEMA.db (No such file or directory) 

我已經改變e.printStackTrace(而不是拋出expecption。

我想,我problem.because在小尺寸300KB(testng2.db)。那一個也給予同樣的錯誤做了同樣的事情,這不是文件大小

我真正的手機是HTC HD2其WindowsMo​​bile®的6.5專業。

請幫幫我。

在此先感謝...

+0

請問您可以發佈一些信息:包名稱,資產文件夾的路徑,獲取資產數據庫文件的代碼段。我認爲可能是問題屬於資產文件的錯誤路徑。 – NguyenDat

+0

我已更新我的代碼。請幫助我 – Piraba

+0

請注意,資產中的文件大小受到1048576個字節(1MB)的限制。所以一旦你真的讀了你的文件,你會得到一個IOException。有關詳細信息和解決方法,請參閱此鏈接:http://groups.google.com/group/android-developers/browse_thread/thread/e7857f4eaf2856fd/b18ed9f9a6b9072a?lnk=gst&&pli=1 – Alexey

回答

1

問題是您無法讀取資產文件夾中的數據。確保DB_NAME已形成 "mydatabase.db"(包括擴展名)。嘗試使用小寫,可能區分大小寫。

0

感謝張貼你的源代碼,我看問題的方法:copyDataBase() 因爲DB_NAME錯誤的道路,正確的是「數據庫/ MasterUserVentura_HEMA.db」 試試這個:

InputStream myInput = myContext.getAssets().open("databases/MasterUserVentura_HEMA.db"); 
+0

沒有。我得到了java.io.FileNotFoundException:databases/MasterUserVentura_HEMA.db。 – Piraba

+0

對不起,可能是我想念的東西 – NguyenDat