2013-07-04 24 views
1

我想從資產創建數據庫,但給我錯誤無法打開數據庫 ,但我運行後再次不給錯誤是完整運行 當第一次創建是給我錯誤我把我的logcat在這裏sqlite3_open_v2(「/ data/data/com.food.find/databases/mydatabase」,&handle,2,NULL)在android中失敗?

07-04 18:28:00.860: E/Database(990): sqlite3_open_v2("/data/data/com.temp.find/databases/tempfind", &handle, 2, NULL) failed 
07-04 18:28:00.870: W/System.err(990): android.database.sqlite.SQLiteException: unable to open database file 
07-04 18:28:00.880: W/System.err(990): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
07-04 18:28:00.880: W/System.err(990): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849) 
07-04 18:28:00.880: W/System.err(990): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
07-04 18:28:00.880: W/System.err(990): at com.food.find.RestaurantDatabase.checkDataBase(RestaurantDatabase.java:97) 
07-04 18:28:00.890: W/System.err(990): at com.food.find.RestaurantDatabase.createDataBase(RestaurantDatabase.java:60) 
07-04 18:28:00.890: W/System.err(990): at com.food.find.SplashScreenActivity.onCreate(SplashScreenActivity.java:25) 
07-04 18:28:00.890: W/System.err(990): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-04 18:28:00.890: W/System.err(990): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
07-04 18:28:00.890: W/System.err(990): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
07-04 18:28:00.890: W/System.err(990): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
07-04 18:28:00.900: W/System.err(990): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
07-04 18:28:00.900: W/System.err(990): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-04 18:28:00.900: W/System.err(990): at android.os.Looper.loop(Looper.java:123) 
07-04 18:28:00.900: W/System.err(990): at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-04 18:28:00.900: W/System.err(990): at java.lang.reflect.Method.invokeNative(Native Method) 
07-04 18:28:00.900: W/System.err(990): at java.lang.reflect.Method.invoke(Method.java:507) 
07-04 18:28:00.900: W/System.err(990): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
07-04 18:28:00.900: W/System.err(990): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
07-04 18:28:00.910: W/System.err(990): at dalvik.system.NativeStart.main(Native Method) 
07-04 18:28:01.030: E/running(990): database opened page size 

RestaurantDatabase.java

public class RestaurantDatabase extends SQLiteOpenHelper{ 


    // Contacts Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_FOODADDRESS="address"; 
    private static final String KEY_FOODPHONE = "phonenumber"; 
    private static final String KEY_LATITUDE="latitude"; 
    private static final String KEY_LONGITUDE="longitude"; 



    private static final String TAG_LAT="lat"; 
    private static final String TAG_LONG="lng"; 
    private static final String TAG_RESPONSE = "responseData"; 
    private static final String TAG_TITLENOFORMATING = "titleNoFormatting"; 
    private static final String TAG_ADDRESSLINES="addressLines"; 
    private static final String TAG_PHONENUMBERS="phoneNumbers"; 
    private static final String TAG_NUMBER="number";  
    private static final String TAG_FOOD="food"; 
    private static String DB_PATH ="/data/data/com.temp.find/databases/"; 
    private static String DB_NAME ="tempfind"; 
    private SQLiteDatabase myDataBase; 
    private final Context myContext;  

    String query = ""; 

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

    public void createDataBase() throws IOException 
    { 

     boolean dbExist = checkDataBase(); 

     if(dbExist) 
     { 

     } 
     else 
     { 


     this.getReadableDatabase(); 

     try 
     { 

      copyDataBase(); 

     } 
     catch (IOException e) 
     { 

      throw new Error("Error copying database"); 

     } 

     } 


    } 


    private boolean checkDataBase() 
    { 

     SQLiteDatabase checkDB = null; 

     try{ 
      String myPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 

     } 
     catch(SQLiteException e) 
     { 
      e.printStackTrace(); 
     } 

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

     return checkDB != null ? true : false; 
    } 


    private void copyDataBase() throws IOException 
    { 


     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     String outFileName = DB_PATH + DB_NAME; 
     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(); 

    } 

    public RestaurantDatabase(Context context, String name, CursorFactory factory,int version) 
    { 
     super(context, name, factory, version); 
     this.myContext=context; 
    } 


     public void openDataBase() throws SQLException 
     {  
       //Open the database 
       String myPath = DB_PATH + DB_NAME; 
       myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
       Log.e("running", "database opened page size"); 

     } 

     @Override 
     public synchronized void close() 
     { 

      if(myDataBase != null) 
       myDataBase.close(); 
      super.close(); 

     } 



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

    } 

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


    } 

    public String addContact(String title,String address,String phone,String latitude,String longitude) 
    { 

     String check = null; 

     Log.e("Title","--->"+title); 
     Log.e("Address","-->"+address); 
     Log.e("Number","-->"+phone); 
     Log.e("Latitude","-->"+latitude); 
     Log.e("Longitude","-->"+longitude); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME,title); // Contact Name 
     values.put(KEY_FOODADDRESS,address); // Contact Address 
     values.put(KEY_FOODPHONE,phone); // Contact Phone 
     values.put(KEY_LATITUDE,latitude); // Contact Latitude 
     values.put(KEY_LONGITUDE,longitude); // Contact Longitude 

     Log.e("addcontact called","--->"); 

     // Inserting Row 
     myDataBase.insert(TAG_FOOD, null,values);  

     String selectQuery = " SELECT * FROM " + TAG_FOOD ; 

     Cursor cursor = myDataBase.rawQuery(selectQuery, null); 

     Log.e("CURSOR RECORD","--->"+cursor.getCount()); 
     Log.e("INSERT RECORD","--->"+values); 


     return check; 


    } 



} 
+0

你有沒有添加權限將外部存儲寫入androidmanifest? –

+0

不,我會添加它,並在回覆你之後再次檢查 –

+0

你甚至可以理解這段代碼嗎? ......如果沒有'/data/data/com.temp,它應該打印這條消息。找到/數據庫/ tempfind'文件 – Selvin

回答

3

使用此代碼更改chekDatabase這項工作完全

私人布爾checkDataBase(){

文件DBFILE =新的文件(DB_PATH + DB_NAME); return dbFile.exists();

}

5

此代碼是可怕。我會開始刪除整個事情,並重新開始。

首先,如果打算將數據庫打包到應用程序中,請不要爲此編寫自己的代碼。有an existing library, SQLiteAssetHelper,這是測試,調試和支持。更重要的是,它是由某人(Jeff Gilfelt)編寫的,具有Android開發經驗的lot

第二,如果你使用的是SQLiteOpenHelper(或類似SQLiteAssetHelper一個子類),你是openDatabase()隨時隨地該數據庫,你做錯了。完整且完整的後面的SQLiteOpenHelper就是有爲你打開數據庫,所以它可以根據需要創建或升級那個數據庫。

第三,如果你使用的是SQLiteOpenHelper(或子類像SQLiteAssetHelper),你有onCreate()方法,你做錯了。這裏需要有代碼來實際創建數據庫,無論這是您繼承的代碼(例如,從SQLiteAssetHelper)還是您編寫的代碼。

第四,如果你正在使用SQLiteOpenHelper(或子類像SQLiteAssetHelper),以及您所呼叫getReadableDatabase()getWriteableDatabase()被忽略返回值你做錯了。您調用這些方法打開數據庫,爲您提供SQLiteDatabase供使用。

這段代碼還有很多錯誤,但是這應該足以讓你更接近合理的實現。

相關問題