2013-02-14 80 views
0

我正在爲android實現一個數據庫相關的應用程序。同樣的項目也在IOS中實施。我可以使用這個ios數據庫文件到我的android項目?如果是這樣,任何人都可以幫助我,我怎麼能做到這一點?是否可以爲Android項目使用ios數據庫文件?

編輯:

以下是我的代碼和日誌,請幫助我,我得到的日誌中的錯誤,但我的應用程序並沒有崩潰。我唯一擔心的是我犯了什麼錯誤。請幫幫我。

我的代碼是:

public class DataBaseHelper extends SQLiteOpenHelper{ 

//The Android's default system path of your application database. 
private static String DB_PATH = "/data/data/com.example.test/databases/"; 

private static String DB_NAME = "testdb.sql"; 

private SQLiteDatabase myDataBase; 

private final Context myContext; 
public DataBaseHelper(Context context) { 

    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
    } 
private void copyDataBase() throws IOException 
{ 

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

    // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 

    //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(); 

} 

public void openDataBase() throws SQLException 
{ 

    //Open the database 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

} 

@Override 
public synchronized void close() 
{ 

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

    super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) 
{ 

} 

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

} 
public void createDataBase() throws IOException 
{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist) 
    { 
    //do nothing - database already exist 
    } 
    else 
    { 

    //By calling this method and empty database will be created into the default system path 
    //of your application so we are gonna be able to overwrite that database with our database. 
     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_READONLY); 

    } 
    catch(SQLiteException e) 
    { 

    //database does't exist yet. 

    } 

    if(checkDB != null) 
    { 

    checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
} 

}

錯誤日誌:

02-14 04:42:01.358: E/SQLiteLog(1552): (14) cannot open file at line 30176 of [00bb9c9ce4] 
02-14 04:42:01.378: E/SQLiteLog(1552): (14) os_unix.c:30176: (2) open(/data/data/com.example.test/databases/testdb.sql) - 
02-14 04:42:01.508: E/SQLiteDatabase(1552): Failed to open database '/data/data/com.example.test/databases/testdb.sql'. 
02-14 04:42:01.508: E/SQLiteDatabase(1552): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at com.example.test.DataBaseHelper.checkDataBase(DataBaseHelper.java:126) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at com.example.test.DataBaseHelper.createDataBase(DataBaseHelper.java:90) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at com.example.test.LoginActivity.onCreate(LoginActivity.java:59) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.Activity.performCreate(Activity.java:5104) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.os.Looper.loop(Looper.java:137) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-14 04:42:01.508: E/SQLiteDatabase(1552):  at dalvik.system.NativeStart.main(Native Method) 

謝謝 Sekhar。

+0

檢查鏈接希望使用全給你 duggu 2013-02-14 08:30:53

回答

1

簡短的回答是:是的。但有一些考慮因素。

  1. 如果iOS項目使用核心數據,生成的數據庫文件的架構將會很複雜。另請參閱下一點。

  2. 如果iOS的項目使用SQLite數據庫沒有核心數據,你可以使用它作爲這樣的,但你必須確保:

    • 你的表的id字段被命名爲_id
    • 有一個名爲表android_metada這是使用CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')具有使用創建的行創建INSERT INTO "android_metadata" VALUES ('en_US')

(來源:reigndesign: Using your own SQLite database in Android applications

+2

如果您將'SQLiteDatabase.NO_LOCALIZED_COLLATORS'傳遞給'SQLiteDatabase.openDatabase()'' – iTech 2013-02-14 08:49:36

+0

@iTech:+1,'android_metadata'表是**不強制**。你是對的夥伴。 – Anukool 2013-02-14 08:51:19

+0

我只是想知道爲什麼我需要爲某些sqlite數據庫使用NO_LOCALIZED_COLLATORS。謝謝@iTech – mihail 2013-02-14 09:34:48

相關問題