SQLiteOpenHelper-создание базы данных на SD-карте


В моем тестовом android-приложении я намерен создать и получить доступ к файлу базы данных, который будет расположен на SD-карте. Я использую main activity с помощью класса, который расширяет SQLiteOpenHelper. Я хочу использовать его так же, как и раньше, но мне нужно как-то изменить путь к базе данных. Знаете ли вы, как этого добиться?

Thx

Мой текущий код класса, который расширяет SQLiteOpenHelper:

public class DatabaseDefinition extends SQLiteOpenHelper{
private static final String DATABASE_NAME="test.db";
private static final int DATABASE_VERSION=1;

public DatabaseDefinition(Context context) {
    super(context,DATABASE_NAME,null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE "+TABLE_NAME+" ("+ _ID +" INTEGER PRIMARY KEY AUTOINCREMENT, "+ NAME+" TEXT NOT NULL, " +SURNAME+" TEXT NOT NULL, "+PHONE+" INT NOT NULL);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
    onCreate(db);

}

И код моего главного:

public class DatabaseExampleActivity extends Activity {
   private DatabaseDefinition database;
   private static String[] FROM={_ID, NAME, SURNAME,PHONE};
   private static String ORDER_BY=" DESC";


   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       database= new DatabaseDefinition(this); 
       try{
         String name = null;
         String surname=null;
         int phone=0;
         addEvent("John", "Black", 111012345);

    }finally{
        database.close();
    }
  }



}
2 5

2 ответа:

Сначала необходимо указать путь к SD-карте. Вы можете сделать это, создав строку, подобную этой:

public static final String  DATABASE_FILE_PATH = "/sdcard";

Но для вас стоит позвонить

Environment.getExternalStorageDirectory()   

Чтобы получить корневой путь к SD-карте и использовать его для создания базы данных. После этого вы создаете базу данных, как вы хотите. Вот пример

public class DatabaseHelper
{ 
   private static final String TAG                  = "DatabaseHelper";

  public static final String  DATABASE_FILE_PATH      = Environment.getExternalStorageDirectory();
  public static final String  DATABASE_NAME      = "mydb"; 
  public static final String  TRACKS_TABLE        = "tracks";
  public static final String  TRACK_INFO_TABLE        = "track_info";

  private static final String TRACKS_TABLE_CREATE     = "create table "
           + TRACKS_TABLE
           + " (_id integer primary key autoincrement, title text not null, description text null, created_at date not null);";

  private static final String TRACK_INFO_TABLE_CREATE = "create table " 
           + TRACK_INFO_TABLE 
           + " (_id integer primary key autoincrement, track_id integer not null, latitude real not null, longitude real not null, altitude real not null, created_at date not null);";

private SQLiteDatabase      database;

public DatabaseHelper() 
{  
    try
    {
        database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
            + File.separator + DATABASE_NAME, null,SQLiteDatabase.OPEN_READWRITE);
    }
    catch (SQLiteException ex)
    {
        Log.e(TAG, "error -- " + ex.getMessage(), ex);
        // error means tables does not exits
        createTables();
    }
    finally
    {
        DBUtil.safeCloseDataBase(database);
    }
}

private void createTables()
{
    database.execSQL(TRACKS_TABLE_CREATE);
    database.execSQL(TRACK_INFO_TABLE_CREATE);
}

public void close()
{
    DBUtil.safeCloseDataBase(database);
}

public SQLiteDatabase getReadableDatabase()
{
    database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
            + File.separator + DATABASE_NAME, null,
            SQLiteDatabase.OPEN_READONLY);
    return database;
}

public SQLiteDatabase getWritableDatabase()
{
    database = SQLiteDatabase.openDatabase(DATABASE_FILE_PATH
            + File.separator + DATABASE_NAME, null,
            SQLiteDatabase.OPEN_READWRITE);
    return database;
}

И в конце концов вы должны установить разрешение в манифесте следующим образом: android.permission.WRITE_EXTERNAL_STORAGE

Удачи :) Arkde

Если некоторые из вас хотят создать базу данных sqlite на sd-карте, но вы все еще хотите продолжать использовать класс, который расширяет sqliteOpenHelper, вы можете посетить Этот ответ.

Вам просто нужно добавить другой класс, реализовать его в своем классе (который расширяет sqliteOpenHelper) в super (), а затем изменить путь к новому классу.

Примечание: Если вы используете HC или ICS, вам нужно описать "external_sd" на вашем пути. Потому что HC и ICS все равно будут сообщать о хранении, которое физически встроено в устройство