장치에서 sqlite 데이터베이스의 위치


100

확장 SQLiteOpenHelper및 재정 의 기본 방법을 사용하여 프로그래밍 방식으로 sqlite 데이터베이스를 만들었습니다 onCreate(). 이런 식으로 db는 필요할 때 즉시 생성됩니다.

sqlite 브라우저를 사용하여 OS X 컴퓨터에서 db 파일의 내용을 확인하고 싶습니다. db 파일의 이름을 알고 있지만 장치에서 찾을 수 없습니다. USB를 통해 장치에 연결하고 파인더와 터미널을 확인했지만 db 파일을 찾을 수 없습니다.

Android 장치에서 sqlite 데이터베이스의 기본 위치는 무엇입니까?


답변:


96

생성 된 데이터베이스를 찾을 수 있습니다. <your-database-name>

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>

파일 탐색기를 사용하여 꺼내고 SQLiteExplorer에서 사용하려면 .db3 확장자를 갖도록 이름을 바꿉니다.

DDMS의 파일 탐색기를 사용하여 에뮬레이터 디렉터리로 이동합니다.


1
에뮬레이터에서 시도하면 / data로 cd 할 수 있습니다. 그러나 연결된 Galaxy Vibrant로 시도하면 / data로 cd 할 수 없습니다. 이 두 가지 경우에 adb 서버가 다른 용도로 실행됩니까?
Robᵩ 2010-12-15

42
실제 전화에서는 / data 폴더에 액세스 할 수 없습니다. chmoded 700입니다. 이를 보려면 루트 권한이 필요합니다.
Falmarri 2010

15
에서 경로를 얻으려는 경우에는 context.getDatabasePath ( "<your-database-name>")입니다. 실제로 위의 경로를 반환합니다. 읽기-쓰기를 위해이 경로에 액세스 할 수 있지만 데이터베이스를 생성 한 애플리케이션에서만 가능합니다.
Yaroslav Mytkalyk 2014 년

Android가 데이터베이스를 저장하는 기본 경로는 루팅되지 않은 기기에서 액세스 할 수 없습니다. 따라서 데이터베이스 파일에 액세스하는 가장 쉬운 방법 (디버깅 환경에만 해당)은 클래스의 생성자를 수정하는 것입니다. 이 후 몇 가지 답변 (정확히 여기 : stackoverflow.com/a/21832714/2982814 ), 내가 어떻게 관리했는지 확인할 수 있습니다.
RandomUser


45

이를 위해 내가 한 일은

File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;

try
{
  fis=new FileInputStream(f);
  fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
  while(true)
  {
    int i=fis.read();
    if(i!=-1)
    {fos.write(i);}
    else
    {break;}
  }
  fos.flush();
  Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
  e.printStackTrace();
  Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
  try
  {
    fos.close();
    fis.close();
  }
  catch(IOException ioe)
  {}
}

이렇게하려면 앱에 SD 카드에 액세스 할 수있는 권한이 있어야하며 manifest.xml에 다음 설정을 추가해야합니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

훌륭한 방법은 아니지만 작동합니다.


좋은. 나는 이것을 찾고 있었다. 이 방법으로 분석을 위해 전체 DB를 서버에 업로드하도록 선택할 수도 있습니다.
Jeroen 2013 년

3
그렇지 않은 작업을 수행하는 경우 ... 간단하게 확장 ".db3"제거 데이터베이스 이름 "/data/data/your.app.package/databases/your_db"를 사용
나이젤 Crasto

1
이 솔루션은 잘 작동합니다. 그러나 getDatabasePath (your_db_name)를 사용하여 File 객체를 가져오고 getAbsolutePath ()를 사용하여 구성하는 대신 정확한 경로를 얻을 수 있습니다. getDatabasePath 메서드는 ContextWrapper에 정의되어 있습니다.
로이

Android에서 파일 및 경로 이름은 대소 문자를 구분합니다.
AndroidDev

29

컨텍스트에는 많은 경로 함수가 포함되어 있습니다. Context.getXXXPath ()
그중 하나는 dbname이라는 데이터베이스의 절대 경로를 반환하는 android.content.Context.getDatabasePath (String dbname)입니다.

Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);

이 경우 반환 된 경로는 다음과 같습니다.

/data/data/com.me.myapp/databases/mydb.db

이 경로는 SQLiteOpenHelper를 사용하여 DB를 여는 경우 자동 생성됩니다.


25

실제 장치에 대해 이야기하는 경우 /data/data/<application-package-name>액세스 할 수 없습니다. 루트 권한이 있어야합니다 ...


그것은 정확히 사실이 아닙니다. 그것은 아니다 탐색 할 수 있지만, 접근성 파일은 내 개인의 권한 비트에 따라 달라집니다.
Chris Stratton 2014 년

내 전화가 루팅되었습니다. 데이터 폴더를 어떻게 "찾아 볼"수 있습니까?
Sreecharan Desabattula

@SreecharanDesabattula, adb 셸로 이동하고 "su"명령을 사용하여 수퍼 유저로 전환하여 디렉터리를 찾아야합니다.
Gautham C.

/ system / bin / sh : su : 찾을 수 없음
Sunnyday

시도 @Sunnydaysudo su
Mohammedsalim SHIVANI에게

19

이것은 오래된 질문이지만 대답하면 다른 사람들에게 도움이 될 수 있습니다.

Android가 데이터베이스를 저장하는 기본 경로는 루팅되지 않은 기기에서 액세스 할 수 없습니다. 따라서 데이터베이스 파일에 액세스하는 가장 쉬운 방법 (디버깅 환경에만 해당)은 클래스의 생성자를 수정하는 것입니다.

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "/mnt/sdcard/database_name.db", null, 0);
    }
}

다음 라인을 사용하여 프로덕션 환경에 맞게 변경해야합니다.

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}

나는 이것을 시도하고 오류 Failed to open database '/mnt/sdcard/itens'.를 반환 했습니다Logcat
underfilho

1
정말 미안 해요. 이 대답은 네 살입니다. 그리고 OP는 그보다 오래되었습니다 (2010). 현재 Android는 2010 년과 크게 다릅니다. 따라서 데이터베이스 위치는 다른 경로에있을 수 있습니다. 더 이상 도움을 드릴 수 없어서 죄송합니다.
RandomUser

응용 프로그램이 어쨌든, 쓰기 덕분에 허용되지 않았기 때문에 아마도 오류가 발생했습니다
underfilho


9

SQLite 데이터베이스는 파일 일뿐입니다. 해당 파일을 가져 와서 이동하고 다른 시스템 (예 : 휴대폰에서 워크 스테이션으로)으로 복사 할 수도 있습니다. 그러면 제대로 작동합니다. Android는 파일을 /data/data/packagename/databases/디렉토리 에 저장합니다 . Eclipse ( ) 에서 또는를 사용하여 adb command보거나 이동하거나 삭제할 수 있습니다.File Explorer viewWindow > Show View > Other... > Android > File Explorer


9

늦었을 수도 있지만 도움이 될 것입니다. adb를 통해 기기를 루팅 하지 않고도 데이터베이스에 액세스 할 수 있습니다.

cmd를 사용하여 adb를 시작하고 다음 명령을 입력하십시오.

-run-as com.your.package  
-shell@android:/data/data/com.your.package $ ls  
cache  
databases  
lib  
shared_prefs  

이제 여기에서 열 수 있습니다.


4
예, 디버그 APK의 경우입니다. 아니요, 프로덕션 버전 (또는 실행이 중단 된 Android 릴리스)의 경우입니다.
Chris Stratton 2014 년

5

경로를 제공하지 않고 db 이름을 파일로 지정하면 폴더를 얻는 가장 일반적인 방법은 다음과 같습니다.

final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

"mydatabase.db"와 같은 곳 DBAdapter.DATABASE_NAME은 어디에 있습니까 String?
Context.getFilesDir()다음과 같은 앱 파일의 경로를 반환합니다. /data/data/<your.app.packagename>/files/따라서 .getParent()+"/databases/""파일"을 제거하고 "데이터베이스"를 대신 추가해야합니다.
BTW Eclipse는 하드 코딩 된 "data / data /"문자열에 대해 경고하지만이 경우에는 경고하지 않습니다.


3
By Default it stores to:    

String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

Where:

String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";

그리고 데이터베이스가 장치 저장소에 저장되어 있는지 확인하십시오. 그렇다면 Manifest.xml에서 권한을 사용해야합니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3

adb shell how-to를 사용하여 액세스 할 수 있습니다.

위 링크의 내용 :

자습서 : 명령 줄을 사용하여 Android 데이터베이스에 액세스하는 방법. 프로그램에서 데이터베이스를 다루기 시작할 때 프로그램 외부에서 직접 데이터베이스에 액세스하여 프로그램이 방금 수행 한 작업을 확인하고 디버깅 할 수있는 것이 정말 중요하고 유용합니다.

Android에서도 중요합니다.

방법은 다음과 같습니다.

1) 에뮬레이터를 실행하거나 실제 장치를 PC에 연결합니다. 나는 보통 이것을 위해 Eclipse에서 내 프로그램 중 하나를 시작합니다. 2) Android 도구 디렉토리에서 명령 프롬프트를 시작하십시오. 3) adb shell을 입력합니다. 그러면 에뮬레이터 / 연결된 장치에서 유닉스 셸이 시작됩니다. 4) 데이터베이스가있는 디렉토리로 이동합니다. cd data / data 여기에 장치의 모든 애플리케이션 목록이 있습니다. 애플리케이션 디렉토리로 이동합니다 (유닉스는 대소 문자를 구분합니다 !!) cd com.alocaly.LetterGame 데이터베이스 디렉토리 : cd 데이터베이스 여기에서 모든 데이터베이스를 찾을 수 있습니다. 제 경우에는 (현재) SCORE_DB 5) 확인 / 변경할 데이터베이스에서 sqlite를 실행합니다. sqlite3 SCORE_DB 여기에서 어떤 테이블이 있는지 확인할 수 있습니다. .tables 6) 원하는 SQL 명령어를 입력합니다. : 점수에서 *를 선택합니다.

이것은 매우 간단하지만 필요할 때마다 어디서 찾을 수 있는지 모르겠습니다.


1

응용 프로그램에서 데이터베이스를 생성하는 경우이 데이터베이스는 기본적으로 디렉토리에 저장됩니다. DATA/data/APP_NAME/databases/FILENAME.

위 디렉토리의 일부는 다음 규칙에 따라 구성됩니다. DATA는 Environment.getDataDirectory () 메서드가 반환하는 경로입니다. APP_NAME은 애플리케이션 이름입니다. FILENAME은 데이터베이스의 애플리케이션 코드에서 지정하는 이름입니다.


0

IDE에 Eclipse의 DDMS Perspective와 같은 유틸리티가 있는지 여부를 확인할 수도 있습니다.이 유틸리티를 사용하면 디렉토리를 탐색하거나 에뮬레이터 또는 루팅 된 장치에서 파일을 복사 할 수 있습니다.


0

다음과 같이 데이터베이스 이름을 정의하십시오.

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";

그리고 다음에서 데이터베이스를 볼 수 있습니다.

storage/sdcard0/yourdatabasename.db

0

공개 클래스 MySQLiteOpenHelper는 SQLiteOpenHelper를 확장합니다. {MySQLiteOpenHelper (컨텍스트 컨텍스트) {super (context, "/mnt/sdcard/database_name.db", null, 0); }}

"/ sdcard /"를 하드 코딩하지 마십시오. 대신 Environment.getExternalStorageDirectory (). getPath () 사용


0

같은 경로를 하드 코딩하지 마십시오 //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. 대부분의 경우 잘 작동하지만 장치가 여러 사용자를 지원할 수있는 장치에서는 작동하지 않습니다. 경로는 다음과 같을 수 있습니다 //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. 이에 대한 가능한 해결책은 context.getDatabasePath(<your-database-name>).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.