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

まず、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

于 2011-08-29T11:43:35.633 に答える
0

SDカード上にsqliteデータベースを作成したいが、それでも拡張クラスを使用したい場合は、この回答にsqliteOpenHelperアクセスしてください。

sqliteOpenHelper別のクラスを追加し、super()でクラス(extends)に実装してから、新しいクラスのパスを変更するだけです。

注: HCまたはICSを使用している場合は、パスに「external_sd」を記述する必要があります。HCとICSは、デバイスに物理的に組み込まれているストレージを引き続き報告するためです。

于 2013-04-12T04:46:38.703 に答える