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 ответа:
Сначала необходимо указать путь к 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 все равно будут сообщать о хранении, которое физически встроено в устройство