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

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 01 май 2014, 18:12

Привет всем.

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

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

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

уверен просто, но решить не могу...
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 01 май 2014, 20:58

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

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

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;
	}
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 01 май 2014, 21:07

Можно попробовать ее открыть. Если это не файл баз данных, с генерируется исключение SQLiteException.
Собственно Foenix меня опередила и уже все написала.
Добавлю, только, еще кое-что, нужно обязательно проследить, что отработала команда update, если восстанавливается бэкап из старой версии.
Кстати, для уменьшения размера базы, а следовательно и бэкапа, можно воспользоваться командой VACUUM
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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]

и тогда мой кусок кода работает... Что не так?
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 01 май 2014, 22:00

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

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 01 май 2014, 22:18

по-моему нельзя узнать версию, кроме как записать ее при бэкапе в имя файла
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 01 май 2014, 22:58

Хм. Жаль, ведь если на Гугл диск, то там предлагается задать-изменить название файла...
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 02 май 2014, 03:45

[syntax=java]sqlDb.getVersion();[/syntax]

у меня возвращает версию.
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 02 май 2014, 04:26

И всеравно проблема.

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

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 02 май 2014, 10:25

парень писал(а): В логах очень много красного и зеленого... Со смылом что файл не принадлежит sql ...
Тим, я думала ты уже перерос такие заявления :)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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]
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 06 май 2014, 17:21

блин, если честно, я такие эксперименты не проводила)) надо проверить :-D
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 06 май 2014, 21:37

мне надо то... чтобы если файл не бд, то вывод диалога с ошибкой, если бд то диалог с "продолжением".
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 11 май 2014, 00:27

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

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

не пробовал - но это совсем дурдом будет?
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 11 май 2014, 08:51

а причем тут активити? все это в отдельном классе, а проверяй откуда хочешь.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

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

Сообщение парень » 11 май 2014, 15:17

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

Спасибо.
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Ответить