Страница 1 из 1

БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 18:12
парень
Привет всем.

Вопрос такой: сделал резервную копию, как через гугл диск так и с СД карты...

Принцип восстановления прост, просто копирование файла в файл БД. (у меня mydb), но не знаю как лучше проверку сделать на приемный файл. Ведь пользователь может выбрать картинку например или прочий файл...

Нужно чтото вроде
если файл=файл БД то { ...} иначе {...}

уверен просто, но решить не могу...

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 20:58
Foenix
У меня несколько уровней защиты)) во-первых открываю только файл с именем по моему шаблону (не даю выбрать что угодно)
Во-вторых, вот такая функция на валидность - там проверяются даже поля таблиц, т.к. пользователь может заколбасить старую базу, например, где какие-то таблицы отсутсвуют. КОнечно, не прям в точности это можно проверить - но хоть как-то..

Код: Выделить всё

protected static boolean checkDbIsValid(File db) {
		try {
			SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase(db.getPath(), null, SQLiteDatabase.OPEN_READONLY);
			
			for (String sTABLE : DatabaseHelper.aTABLES) {
				Cursor cursor = sqlDb.query(true, sTABLE, null, null, null, null, null, null, null);
				...
				if (sTABLE == "tblХХХ") {
					for (String sFIELD : tblХХХ.aFIELDS) {
						cursor.getColumnIndexOrThrow(sFIELD);
					}
				}
				...
				cursor.close();
			}
			sqlDb.close();
		} catch (IllegalArgumentException e) {
			// Log.d(TAG, "бд есть, но не того типа, что нужна");
			e.printStackTrace();
			return false;
		} catch (SQLiteException e) {
			// Log.d(TAG, "не бд");
			e.printStackTrace();
			return false;
		} catch (Exception e) {
			// Log.d(TAG, "что-то еще случилось");
			e.printStackTrace();
			return false;
		}

		return true;
	}

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 21:07
KamiSempai
Можно попробовать ее открыть. Если это не файл баз данных, с генерируется исключение SQLiteException.
Собственно Foenix меня опередила и уже все написала.
Добавлю, только, еще кое-что, нужно обязательно проследить, что отработала команда update, если восстанавливается бэкап из старой версии.
Кстати, для уменьшения размера базы, а следовательно и бэкапа, можно воспользоваться командой VACUUM

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 21:53
парень
Спасибо. Собственно примерно так и делал. Хз почему, ну у меня все-равно крашилось приложение...
Но теперь догадываюсь где я промахнулся...

Еще вопрос.

При выборе файла с гугл диска например, мне сначала надо его создать в телефоне, затем проверить, и лишь затем заменить файл БД. Верно?

И еще вопрос:

Кусок кода для отправки файла БД...
[syntax=java] Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
File data2 = Environment.getDataDirectory();
File currentDB = new File(data2, currentDBPath);
uri=Uri.fromFile(currentDB);

shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("file/*");

startActivity(Intent.createChooser(shareIntent,
"Выберите приложение"));
[/syntax]

где тут ошибка? файл не передается...

Нашел решение, сначала я создаю временный файл на карте, а затем
[syntax=java] uri=Uri.fromFile(fileTemp);[/syntax]

и тогда мой кусок кода работает... Что не так?

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 22:00
парень
KamiSempai писал(а):
Добавлю, только, еще кое-что, нужно обязательно проследить, что отработала команда update, если восстанавливается бэкап из старой версии.
Как узнать какая версия у БД?

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 22:18
Foenix
по-моему нельзя узнать версию, кроме как записать ее при бэкапе в имя файла

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 01 май 2014, 22:58
парень
Хм. Жаль, ведь если на Гугл диск, то там предлагается задать-изменить название файла...

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 02 май 2014, 03:45
парень
[syntax=java]sqlDb.getVersion();[/syntax]

у меня возвращает версию.

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 02 май 2014, 04:26
парень
И всеравно проблема.

Инна, скопировал твой код.
Если файл выбираю верный - все ок.
Если файл не БД, то у меня активити перезагружается... обрывается выполнение кода. На любом запросе к "sqlDb", будь то query, хоть getVersion() ...
В логах очень много красного и зеленого... Со смылом что файл не принадлежит sql ...

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 02 май 2014, 10:25
Foenix
парень писал(а): В логах очень много красного и зеленого... Со смылом что файл не принадлежит sql ...
Тим, я думала ты уже перерос такие заявления :)

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 06 май 2014, 06:18
парень
и правда... погорячился )))

[syntax=java]E/SQLiteLog: (26) file is encrypted or is not a database[/syntax]

если файл есть, но это не бд.

если файл есть, это бд, но не наша. то срабатывает. код продолжает выполняться.
[syntax=java]catch (IllegalArgumentException e)[/syntax]

если файла нет (специально делал путь левый) то срабатывает тоже чтото уже не важно. код продолжает выполняться.

если файл есть, это бд, наша. то все ок.

Не могу понять почему не срабатывает исключение на несоответствие файла БД... А почему то перезагрузка активити, или его закрытие...
[syntax=java5]
05-06 06:58:24.606: E/SQLiteLog(30472): (26) file is encrypted or is not a database
05-06 06:58:24.616: E/SQLiteLog(30472): (26) file is encrypted or is not a database
05-06 06:58:24.616: W/SQLiteDBG(30472): getJournalMode: Fail to compile statment: pragma journal_mode;. error code = 26, msg: file is encrypted or is not a database
05-06 06:58:24.616: W/SQLiteDBG(30472): getJournalMode: errno = 2, error message = No such file or directory
05-06 06:58:24.616: W/SQLiteDBG(30472): Backup db, too many times, already: 10 !!
05-06 06:58:24.616: W/dalvikvm(30472): JNI WARNING: input is not valid Modified UTF-8: illegal start byte 0x90
05-06 06:58:24.616: W/dalvikvm(30472): string: '???k is encrypted or is not a database (code 26): , while compiling: PRAGMA journal_mode'
05-06 06:58:24.616: W/dalvikvm(30472): in Landroid/database/sqlite/SQLiteConnection;.nativePrepareStatement:(ILjava/lang/String;)I (ThrowNew)
05-06 06:58:24.616: I/dalvikvm(30472): "main" prio=5 tid=1 NATIVE
05-06 06:58:24.616: I/dalvikvm(30472): | group="main" sCount=0 dsCount=0 obj=0x40c2cc10 self=0x4034b420
05-06 06:58:24.616: I/dalvikvm(30472): | sysTid=30472 nice=0 sched=0/0 cgrp=apps handle=1075787228
05-06 06:58:24.616: I/dalvikvm(30472): | state=R schedstat=( 0 0 0 ) utm=82 stm=15 core=2
05-06 06:58:24.626: I/dalvikvm(30472): #00 pc 000012a0 /system/lib/libcorkscrew.so (unwind_backtrace_thread+27)
05-06 06:58:24.626: I/dalvikvm(30472): #01 pc 000694d4 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+35)
05-06 06:58:24.626: I/dalvikvm(30472): #02 pc 0005b4ec /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+335)
05-06 06:58:24.626: I/dalvikvm(30472): #03 pc 0005b58e /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25)
05-06 06:58:24.626: I/dalvikvm(30472): #04 pc 0003c996 /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #05 pc 0003e676 /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #06 pc 00045dc2 /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #07 pc 00000e04 /system/lib/libnativehelper.so (jniThrowException+203)
05-06 06:58:24.626: I/dalvikvm(30472): #08 pc 0005f622 /system/lib/libandroid_runtime.so (android::throw_sqlite3_exception(_JNIEnv*, int, char const*, char const*)+261)
05-06 06:58:24.626: I/dalvikvm(30472): #09 pc 0005fd22 /system/lib/libandroid_runtime.so
05-06 06:58:24.626: I/dalvikvm(30472): #10 pc 00020390 /system/lib/libdvm.so (dvmPlatformInvoke+112)
05-06 06:58:24.626: I/dalvikvm(30472): #11 pc 000532ca /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+425)
05-06 06:58:24.626: I/dalvikvm(30472): #12 pc 00029820 /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #13 pc 0002ee54 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+232)
05-06 06:58:24.626: I/dalvikvm(30472): #14 pc 000696d6 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+373)
05-06 06:58:24.626: I/dalvikvm(30472): #15 pc 000728ca /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #16 pc 00029820 /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #17 pc 0002ee54 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+232)
05-06 06:58:24.626: I/dalvikvm(30472): #18 pc 000693b8 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+271)
05-06 06:58:24.626: I/dalvikvm(30472): #19 pc 0004f4de /system/lib/libdvm.so
05-06 06:58:24.626: I/dalvikvm(30472): #20 pc 0004d49e /system/lib/libandroid_runtime.so
05-06 06:58:24.626: I/dalvikvm(30472): #21 pc 0004e33c /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+539)
05-06 06:58:24.626: I/dalvikvm(30472): #22 pc 00000e66 /system/bin/app_process
05-06 06:58:24.626: I/dalvikvm(30472): #23 pc 00012810 /system/lib/libc.so (__libc_init+35)
05-06 06:58:24.626: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
05-06 06:58:24.626: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:909)
05-06 06:58:24.626: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:654)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:340)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:314)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:239)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:214)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:849)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:829)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:734)
05-06 06:58:24.636: I/dalvikvm(30472): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1135)
05-06 06:58:24.636: I/dalvikvm(30472): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
05-06 06:58:24.636: I/dalvikvm(30472): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
05-06 06:58:24.636: I/dalvikvm(30472): at com.buhgalter.ru.DB.checkDBforRezerv(DB.java:75)
05-06 06:58:24.636: I/dalvikvm(30472): at com.buhgalter.ru.rezerv.checkBD(rezerv.java:138)
05-06 06:58:24.636: I/dalvikvm(30472): at com.buhgalter.ru.rezerv.access$0(rezerv.java:136)
05-06 06:58:24.636: I/dalvikvm(30472): at com.buhgalter.ru.rezerv$1.onItemClick(rezerv.java:76)
05-06 06:58:24.636: I/dalvikvm(30472): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
05-06 06:58:24.636: I/dalvikvm(30472): at android.widget.AbsListView.performItemClick(AbsListView.java:1223)
05-06 06:58:24.636: I/dalvikvm(30472): at android.widget.ListView.performItemClick(ListView.java:4506)
05-06 06:58:24.636: I/dalvikvm(30472): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2967)
05-06 06:58:24.636: I/dalvikvm(30472): at android.widget.AbsListView$1.run(AbsListView.java:3653)
05-06 06:58:24.636: I/dalvikvm(30472): at android.os.Handler.handleCallback(Handler.java:725)
05-06 06:58:24.636: I/dalvikvm(30472): at android.os.Handler.dispatchMessage(Handler.java:92)
05-06 06:58:24.636: I/dalvikvm(30472): at android.os.Looper.loop(Looper.java:158)
05-06 06:58:24.636: I/dalvikvm(30472): at android.app.ActivityThread.main(ActivityThread.java:5777)
05-06 06:58:24.636: I/dalvikvm(30472): at java.lang.reflect.Method.invokeNative(Native Method)
05-06 06:58:24.636: I/dalvikvm(30472): at java.lang.reflect.Method.invoke(Method.java:511)
05-06 06:58:24.636: I/dalvikvm(30472): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
05-06 06:58:24.636: I/dalvikvm(30472): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
05-06 06:58:24.636: I/dalvikvm(30472): at dalvik.system.NativeStart.main(Native Method)
05-06 06:58:24.636: E/dalvikvm(30472): VM aborting
05-06 06:58:24.636: A/libc(30472): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 30472 (om.buhgalter.ru)
05-06 06:58:25.237: E/Trace(30851): error opening trace file: No such file or directory (2)
05-06 06:58:25.237: W/asset(30851): Copying FileAsset 0x634f8288 (zip:/data/app/com.buhgalter.ru-1.apk:/resources.arsc) to buffer size 157844 to make it aligned.
05-06 06:58:25.407: I/Adreno200-EGL(30851): <qeglDrvAPI_eglInitialize:265>: EGL 1.4 QUALCOMM build: (CL3449569)
05-06 06:58:25.407: I/Adreno200-EGL(30851): Build Date: 05/14/13 Tue
05-06 06:58:25.407: I/Adreno200-EGL(30851): Local Branch: htc2
05-06 06:58:25.407: I/Adreno200-EGL(30851): Remote Branch:
05-06 06:58:25.407: I/Adreno200-EGL(30851): Local Patches:
05-06 06:58:25.407: I/Adreno200-EGL(30851): Reconstruct Branch:
05-06 06:58:25.617: D/qdmemalloc(30851): ion: Mapped buffer base:0x6bf6c000 size:8355840 offset:0 fd:56
05-06 06:58:25.617: D/qdmemalloc(30851): ion: Mapped buffer base:0x64c47000 size:4096 offset:0 fd:57
05-06 06:58:25.677: D/qdmemalloc(30851): ion: Mapped buffer base:0x6c884000 size:8355840 offset:0 fd:59
05-06 06:58:25.677: D/qdmemalloc(30851): ion: Mapped buffer base:0x64c9d000 size:4096 offset:0 fd:60
05-06 06:58:26.628: D/qdmemalloc(30851): ion: Mapped buffer base:0x6d0ac000 size:8355840 offset:0 fd:61
05-06 06:58:26.628: D/qdmemalloc(30851): ion: Mapped buffer base:0x64c9e000 size:4096 offset:0 fd:62
[/syntax]

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 06 май 2014, 17:21
Foenix
блин, если честно, я такие эксперименты не проводила)) надо проверить :-D

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 06 май 2014, 21:37
парень
мне надо то... чтобы если файл не бд, то вывод диалога с ошибкой, если бд то диалог с "продолжением".

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 11 май 2014, 00:27
парень
Появилась идея... делать проверку файла БД в новом активити, а ловить успешность выполнения в onActivityResult :)))

если проверка пройдена - резуль=ок, а если нет то итак не ок :)

не пробовал - но это совсем дурдом будет?

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 11 май 2014, 08:51
Foenix
а причем тут активити? все это в отдельном классе, а проверяй откуда хочешь.

Re: БД + резервная копия, как понять файл=БД или нет?

Добавлено: 11 май 2014, 15:17
парень
Foenix писал(а):а причем тут активити? все это в отдельном классе, а проверяй откуда хочешь.
Инна а проверь свой пример кода, вот если выбрать абсолютно левый файл, картинку например. У тебя как поведет приложение? Я не могу найти решения этой ошибки. На некоторых форумах находил такой вопрос, но он так без ответа и остался...

Спасибо.