5

在我的测试 android 应用程序中,我打算创建和访问数据库文件,该文件将位于 SD 卡上。我在扩展 SQLiteOpenHelper 的类的帮助下使用主要活动。我想像以前一样使用它,但我必须以某种方式更改数据库 PATH。你知道,如何实现吗?

谢谢

我当前扩展 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();
    }
  }



}
4

2 回答 2

4

首先,您必须指定 sdcard 的路径。您可以通过创建这样的字符串来做到这一点:

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

祝你好运:)

于 2011-08-29T11:43:35.633 回答
0

如果你们中的一些人想在 sd 卡上创建 sqlite 数据库,但仍想继续使用扩展的类sqliteOpenHelper,则可以访问此答案

您只需添加另一个类,sqliteOpenHelper在 super() 中的类(扩展)上实现它,然后更改新类的路径。

注意:如果您使用的是 HC 或 ICS,则需要在路径上描述“external_sd”。因为 HC 和 ICS 仍会报告物理内置于设备中的存储

于 2013-04-12T04:46:38.703 回答