2013-12-11 4 views
2

기본적으로 응용 프로그램의 데이터베이스 파일은 응용 프로그램 데이터에 만들어집니다. "/mnt/sdcard/test.db"와 같은 자체 경로에서 데이터베이스 파일을 만들 수 있습니까?android에서 데이터베이스 파일 만들기

SQLiteOpenhelper를 확장하여 데이터베이스 파일을 만들지 만 앱 데이터 위치에서 생성합니다. sdcard 위치에 만들고 싶습니다. 내가 "db.OpenorCreateDatabase (경로)"와 함께 노력했다. 그 위치에서 db 파일을 만드는 중입니다. 파일을 읽으려고 할 때 충돌이 발생했습니다. 어떻게해야합니까?

+3

예,하지만 다른 응용 프로그램에서 sdcard에 액세스 할 수 있으므로 안전하지 않습니다. – Nfear

+0

당신은 "그것이 부서지고있다"고 설명 할 수 있습니까? – Michael

답변

3

사용자 정의 ContextClass를 제공하고 대상 디렉토리에 쓰기 액세스 권한이있는 경우 SQLiteOpenHelper를 사용자 정의 경로 (적어도 Android 2.2 이상)와 함께 사용할 수 있습니다.

public class DatabaseHelper extends SQLiteOpenHelper { 
private static final int DATABASE_VERSION = 3; 
    ..... 

DatabaseHelper(final Context context, String databaseName) 
    { 
     super(new DatabaseContext(context), databaseName, null, DATABASE_VERSION); 
    } 
} 

그리고 여기가 수행하는 사용자 정의 DatabaseContext 클래스 모든 마법

class DatabaseContext extends ContextWrapper { 

private static final String DEBUG_CONTEXT = "DatabaseContext"; 

public DatabaseContext(Context base) { 
    super(base); 
} 

@Override 
public File getDatabasePath(String name) 
{ 
    File sdcard = Environment.getExternalStorageDirectory();  
    String dbfile = sdcard.getAbsolutePath() + File.separator+ "databases" + File.separator + name; 
    if (!dbfile.endsWith(".db")) 
    { 
     dbfile += ".db" ; 
    } 

    File result = new File(dbfile); 

    if (!result.getParentFile().exists()) 
    { 
     result.getParentFile().mkdirs(); 
    } 

    if (Log.isLoggable(DEBUG_CONTEXT, Log.WARN)) 
    { 
     Log.w(DEBUG_CONTEXT, 
       "getDatabasePath(" + name + ") = " + result.getAbsolutePath()); 
    } 

    return result; 
} 

@Override 
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) 
{ 
    SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null); 
    // SQLiteDatabase result = super.openOrCreateDatabase(name, mode, factory); 
    if (Log.isLoggable(DEBUG_CONTEXT, Log.WARN)) 
    { 
     Log.w(DEBUG_CONTEXT, 
       "openOrCreateDatabase(" + name + ",,) = " + result.getPath()); 
    } 
    return result; 
} 
} 
0

이 오래지만, 사람들을 위해 목적, 간단한 방법을 디버깅 액세스 가능한 디렉토리에서 데이터베이스를 배치를 찾고 있습니다 :

당신의 dbHelper 생성자

이, DB를 이름으로 대체 경로를 추가

private DbHelper(Context context) 
{ 
    super(context, "/mnt/sdcard/"+DATABASE_NAME, null, DATABASE_VERSION); 
} 
,536,

을 기억하고 허가를 추가하십시오 :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
관련 문제