如何将Android SQLite数据库存储到SD卡中

6

我刚刚创建了一个数据库,默认情况下它存储在data/data/database文件夹中。现在我想将数据库存储在sdcard中,我使用了以下代码,请建议在哪里添加代码。谢谢

代码:

    public class DataBaseHandler {
    SQLiteDatabase database;
    private static DataBaseHandler obj;
    private final String TABLE_NAME = "main_db";
    private final String COLUMN_FIRST = "_id";
    MovieDetails md = new MovieDetails();

    private DataBaseHandler(Context context) {
        DataBase dbobj = new DataBase(context, "Id_db.db", null, 1);
        database = dbobj.getWritableDatabase();
    }

    public static DataBaseHandler getinstance(Context context) {
        if (obj == null) {
            obj = new DataBaseHandler(context);
        }
        return obj;
    }

    public void insertData(String id) {
        try {
            ContentValues values = new ContentValues();
            values.put(COLUMN_FIRST, id);
            database.insert(TABLE_NAME, null, values);
        } catch (Exception er) {
            Log.d("Error is===", er.toString());
        }
    }

    public void deleteData(String id) {
        database.delete(TABLE_NAME, BaseColumns._ID + "=" + id, null);
    }

    public Cursor getData() {
        String[] columns = { BaseColumns._ID, COLUMN_FIRST };
        return database
                .query(TABLE_NAME, columns, null, null, null, null, null);
    }

    private class DataBase extends SQLiteOpenHelper {
        public DataBase(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + BaseColumns._ID
                    + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_FIRST
                    + " varchar(50)NOT NULL UNIQUE);");
        }

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

可能是将内部数据库移动到SD卡上的可能性的重复问题。 - jfs
谢谢@jfs的回复,但是你能告诉我在我的上面的代码中哪里需要放置代码以将数据库存储在Sdcard中吗? - Dilip
1个回答

2
使用这个类来复制您的数据库:
public class MyDatabaseTools {
  private String appName = "";
  private String packageName = "";

  public boolean backup() {
    boolean rc = false;

    boolean writeable = isSDCardWriteable();
    if (writeable) {
      File file = new File(Environment.getDataDirectory() + "/data/" + packageName + "/databases/" + MySQLiteOpenHelper.getDatabaseName());

      File fileBackupDir = new File(Environment.getExternalStorageDirectory(), appName + "/backup");
      if (!fileBackupDir.exists()) {
        fileBackupDir.mkdirs();
      }

      if (file.exists()) {
        File fileBackup = new File(fileBackupDir, MySQLiteOpenHelper.getDatabaseName());
        try {
          fileBackup.createNewFile();
          FileUtils.copyFile(file, fileBackup);
          rc = true;
        } catch (IOException ioException) {
          //
        } catch (Exception exception) {
          //
        }
      }
    }

    return rc;
  }

  private boolean isSDCardWriteable() {
    boolean rc = false;

    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
      rc = true;
    }

    return rc;
  }

    public MyDatabaseTools(final Context context, final String appName) {
        this.appName = appName;
        packageName = context.getPackageName();
    }
}

如果您不了解如何使用它,请参考


在上述代码中实现它并不是一件好事。当您完成数据库的创建时,可以在活动中调用此类。 - Lazy Ninja
告诉我一个事情 @Ninja,在我们创建数据库时,它将保存在data/data/databases文件夹中,但我不想在这里保存它,我要将它保存在SD卡上。如果可能的话,如何实现? - Dilip
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/15852/discussion-between-dilip-and-lazy-ninja - Dilip
抱歉,我没有看到你上一条消息。你还有问题吗? - Lazy Ninja
是的,实际上我对这个很困惑。我看过很多例子,每个例子都说要将数据库复制到SD卡中(在我的情况下不是一个好方法)。我不想使用data/data/packageName...只想使用SD卡来存储数据库并从那里执行操作。请告诉我如何做到这一点,并且如果可能的话,请给我提供一些示例。谢谢。 - Dilip
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接