1

I am implementing a database related application for Android. Same project also implemented in iOS. Can I use this iOS db file to my Android project?

Edit

The following is my code and log, I am getting the error in the log but my app was not crashed. My only concern where I did the mistake.

My code is:

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;
}

}

Error Log:

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)
halfer
  • 19,824
  • 17
  • 99
  • 186
Sekhar Bhetalam
  • 4,501
  • 6
  • 33
  • 52

1 Answers1

1

The short answer is: Yes. But there are some considerations.

  1. In case the iOS project uses Core Data, the schema of the generated db file will be complex to understand. Please also see the next point.

  2. In case the iOS project uses sqlite db without Core Data, you can use it as such, but you need to make sure that:

    • The id field of your tables are named _id
    • There is a table named android_metada which is created using CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US') which has a row created using INSERT INTO "android_metadata" VALUES ('en_US')

(Source: reigndesign: Using your own SQLite database in Android applications)

Rajesh
  • 15,724
  • 7
  • 46
  • 95
  • 2
    The `android_metadata` table is **not** mandatory if you pass `SQLiteDatabase.NO_LOCALIZED_COLLATORS` to `SQLiteDatabase.openDatabase()` – iTech Feb 14 '13 at 08:49
  • I was just wondering why I need to use NO_LOCALIZED_COLLATORS for some sqlite databases. Thanks @iTech – mihail Feb 14 '13 at 09:34
  • If you do not need to support more than one locale, then creating the `android_metadata` table is not necessary – iTech Feb 14 '13 at 09:38
  • Thanks for your suggestions guys, but how can I give dbpath. I gave data/data/com.example.test/databases. and dbname is testdb. I got an error when my app try to open the database the error saying that, Failed to open database – Sekhar Bhetalam Feb 14 '13 at 09:38
  • @ChandraSekhar, you can retrieve the db path using `context.getDatabasePath("testdb")`. Paste the logcat when you get errors. – Rajesh Feb 14 '13 at 09:47
  • @Rajesh, I edited my question with error log please have a look at that – Sekhar Bhetalam Feb 14 '13 at 09:49
  • Your path seems to be wrong. Can you please use `String myPath = myContext.getDatabasePath(DB_NAME).toString();` wherever you are using myPath? If it still doesn't work, please start a new question with the new issues you are facing. Then it would be possible for others also to take a look in to it and offer help. Thanks. – Rajesh Feb 14 '13 at 10:01