2011-02-08 2 views
17

Я работаю над некоторым кодом SQLite и хотел бы изучить базу данных. Если я запустил код в эмуляторе, я могу вытащить файл из data \ data \ myProject \ databases с помощью диспетчера файлов DDMS, но если я запустил его на самом аппаратном обеспечении, папка data \ data недоступна. Есть ли способ обойти это, кроме как получить root-доступ к телефону?DDMS-файл Explorer не может получить доступ к данным data (HTC Desire HD)

+1

Для этого вам необходимо укоренить свой телефон. –

+0

Вы должны быть root, чтобы делать это, просматривая, но программа может изменить разрешение файла, сделав его доступным через его полное имя пути. –

ответ

19

SQLIte Database - это фактически файл, хранящийся в памяти телефона, который вы можете скопировать на SD-карту телефона и затем легко получить к нему доступ с вашего ПК. Ниже приведена функция, которая делает именно то, что вам нужно. Перед использованием функции убедитесь, что вы изменили имя пакета и имя базы данных.

public static void backupDatabase() throws IOException { 
    //Open your local db as the input stream 
    String inFileName = "/data/data/your.package.name/databases/database.sqlite"; 
    File dbFile = new File(inFileName); 
    FileInputStream fis = new FileInputStream(dbFile); 

    String outFileName = Environment.getExternalStorageDirectory() 
                + "/database.sqlite"; 
    //Open the empty db as the output stream 
    OutputStream output = new FileOutputStream(outFileName); 
    //transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = fis.read(buffer))>0){ 
     output.write(buffer, 0, length); 
    } 
    //Close the streams 
    output.flush(); 
    output.close(); 
    fis.close(); 
} 

Как вы можете заметить из кода, базы данных всегда хранятся в папке:

/data/data/your.package.name/databases/ 

Имя (в нашем примере «database.sqlite») является тот, который вы выбрали при расширении SQLiteOpenHelper. Очевидно, что вам также нужно заменить «your.package.name» на имя вашего пакета приложений.

+4

Это хорошая техника для тех из нас, у кого нет корневых телефонов. Просто убедитесь, что вы добавили разрешение WRITE_EXTERNAL_STORAGE, иначе это не сработает. Это было поймано в моих обработчиках исключений, поэтому я пропустил это. –

+0

привет, я попробовал, но я действительно не вижу, где находится файл данных. Я использую окна, и мои файлы андроида хранятся в рабочей области, но файл данных под моим пакетом –

1

Я считаю, что ваше приложение может изменять разрешения unix своих локальных файлов данных хранения, чтобы они стали доступными для других приложений и для adb.

Однако ваше приложение не может изменить отсутствие разрешения на список в каталоге/данных защищенного телефона.

В результате вам нужно будет захватить файл с помощью «adb pull/full/path/to/file» - вы не можете его просматривать, так как вы не можете создать список/данные или, возможно, несколько других промежуточных родителей каталога вашего файла.

1

Действительно, единственный способ обойти это - разместить свой файл в каком-то месте, где вы можете получить доступ к нему, как на SD-карте во время разработки. Затем, как только вы будете удовлетворены, работа правильно поместит файл там, где вы хотите.

Я говорю это, потому что у меня есть розничная Nexus One и разработчик Nexus One. При использовании DDMS File Explorer я заметил, что могу просматривать папку с данными на устройстве разработчика, но не мог на розничном устройстве. Я укрепил свой розничный магазин, и это не помогло.

Поэтому я предполагаю, что над этой проблемой должно быть сделано больше исследований. Но до тех пор я надеюсь, что это поможет.

2

Копирование файла в/мнт/SDCard с помощью

cp /data/data/<packagename>/databases/<dbname>/<filename> /mnt/sdcard 

с помощью ADB, а затем скопировать на рабочий стол из/шоссе/SDCard с помощью

adb pull /mnt/sdcard/<filename> 

, а затем использовать sqlite3 для его просмотра.

+2

просто не интересуется, как cp без root .. :) – yoshi

2

Необходимо укоренить свое устройство. Перейдите в командную строку и перейдите в место, где находится ваш adb.

например.

C: \ Program Files \ Android \ Android-SDK \ платформенных инструментов

типа adb root. теперь перейдите в свой файл-проводник и проверьте.

+0

oh my .. такой простой способ сделать это .. вы спасатель жизни .. большое вам спасибо .. –