Активность
- today
- Последняя неделя
-
walid ghe присоединился к сообществу
-
ferizeqepa32 присоединился к сообществу
-
dragan radevic изменил фотографию своего профиля
- Ещё раньше
-
В FDQuery выполняется запрос SELECT ROWID, preport_svodod_kv.get_schiv_name(REESTR_CODE) SCHIV_NAME, preport_svodod_kv.get_reestr_name(REESTR_CODE) REESTR_NAME, preport_svodod_kv.get_razrez_name(RAZREZ_CODE) RAZREZ_NAME, preport_svodod_kv.get_user_name(USER_ID_OR) USER_NAME_OR, k.* from MBANK.KVIT_SVOD_OD2 k where WORK_DATE = to_date('02.09.2024', 'dd.mm.yyyy') and LENTA_ID = '401268*БЕЗРАЗ*2005327356' and (1 = 0 or (1 = 1 and FOND > 0) or (1 = 2 and FOND = 0)) and ('00' = '00' or '00' = preport_svodod_kv.get_schiv_code(REESTR_CODE)) order by REESTR_NAME, REESTR_CODE В результатирующем наборе поля SCHIV_NAME, REESTR_NAME, RAZREZ_NAME, USER_NAME_OR вычисляемые, но FireDac их видит как основные. Почему такое происходит и как это исправить? Проблема в том что потом делается FDQuery1.Edit FDQuery1.Post И нужно чтобы эти поля в update не попадали
-
integracia присоединился к сообществу
-
schwarzes-kreuz присоединился к сообществу
-
JackSon_by присоединился к сообществу
-
Еще, может имеет значение - прога развивалась из примера ForegroundLocationDemo. Ну и с манифестом что-то делал помню, а что - не помню))) Манифест в итоге: <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Cont" android:versionCode="1" android:versionName="2.4.8" android:installLocation="auto"> <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="32" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> <uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" /> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <queries> </queries> <application android:persistent="False" android:restoreAnyVersion="False" android:label="Cont" android:debuggable="true" android:largeHeap="False" android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme" android:hardwareAccelerated="true" android:resizeableActivity="true" android:requestLegacyExternalStorage="true" android:forceDarkAllowed="true"> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.Cont.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider> <service android:name="com.embarcadero.services.ContService" android:exported="false" /> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:exported="true" android:label="Cont" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:resizeableActivity="false" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="Cont" /> <meta-data android:name="android.max_aspect" android:value="2.4" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" /> </application> </manifest> <!-- END_INCLUDE(manifest) --> Манифест в проекте: <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%" android:installLocation="%installLocation%"> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <%uses-permission%> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <queries> <%queries-child-elements%> </queries> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%" android:resizeableActivity="true" android:requestLegacyExternalStorage="true" android:forceDarkAllowed="true"> <%provider%> <%application-meta-data%> <%uses-libraries%> <%services%> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:exported="true" android:label="%activityLabel%" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:resizeableActivity="false" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <meta-data android:name="android.max_aspect" android:value="2.4" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <%activity%> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
-
Доброго ...! В своей программе, на сколько помню, с подобным боролся когда-то... Не знаю, от этого зависит или нет, но вот код у меня такой: В MainForm.Create код: var ApplicationEventService: IFMXApplicationEventService; if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, ApplicationEventService) then ApplicationEventService.SetApplicationEventHandler(HandleApplicationEvent); vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON; aEnable := true; if aEnable then begin CallInUIThread( procedure begin TAndroidHelper.Activity.getWindow.setFlags(vFlags, vFlags); end); end else CallInUIThread( procedure begin TAndroidHelper.Activity.getWindow.clearFlags(vFlags); end); Функция HandleApplicationEvent: function TMainForm.HandleApplicationEvent(ApplicationEvent: TApplicationEvent; Context: TObject): Boolean; begin case ApplicationEvent of TApplicationEvent.WillBecomeInactive: begin TAndroidHelper.Activity.getWindow().addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN or TJWindowManager_LayoutParams.JavaClass.FLAG_LAYOUT_IN_SCREEN ); end; else Result := False; end end; Флаги может не все нужны, а может и код вообще не о том - давно было)...
-
Юра Татарников изменил фотографию своего профиля
-
AngryOwl отреагировал на ответ на вопрос: splash_image_def rad 11.3
-
Здравствуйте, форумчане. Есть большая проблема. У меня лаунчер для андроид магнитол, написанный на delphi 11. Все отлично работает, до ухода магнитолы в сон, логирование настроено, все уже в try except (log)end, плюс onExeption (log), но ошибок ни каких в логе нет просто при выходе из сна оно начинает грузится заново. Сделал wakeLock, проблема не ушла. Оптимизация батареи через powermanager также отключена. Куда копать?
-
Barbanel подписался на Подключение dll к приложению на Андроид
-
Первое: да здравствуют некропостеры ))) Второе: погугли приложение для Android Winlator, удивишься)))
-
Tati присоединился к сообществу
-
Парень, просто интересно - получилось с делфи на андрюше?))))) В 2024-м это выглядит как стартап))))
-
wail info присоединился к сообществу
-
伝説の изменил фотографию своего профиля
-
Алексей Горегляд изменил фотографию своего профиля
-
PRBET RU изменил фотографию своего профиля
-
mlpospel изменил фотографию своего профиля
-
rahal smail изменил фотографию своего профиля
-
Ramon Souza изменил фотографию своего профиля
-
Владимир Бобошко изменил фотографию своего профиля
-
Sergey Rusu изменил фотографию своего профиля
-
Sergio Jordan Evouya присоединился к сообществу
-
Денис Староевров присоединился к сообществу
-
Татьяна Гнедкова присоединился к сообществу
-
Через реестр ищите мониторы по пути Компьютер\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY Далее ищите в мониторе EDID Далее парсите EDID structure, version 1.4 https://en.wikipedia.org/wiki/Extended_Display_Identification_Data unit Unit3; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls, Winapi.Windows, Registry; type TForm3 = class(TForm) lst1: TListBox; btn1: TButton; function GetAllMonitorName : TStringList; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.fmx} procedure TForm3.btn1Click(Sender: TObject); var monitors: TStringList; I: Integer; begin monitors := GetAllMonitorName; lst1.BeginUpdate; for I := 0 to monitors.Count - 1 do begin lst1.Items.Add(monitors.Strings[i]); end; lst1.EndUpdate; end; function TForm3.GetAllMonitorName: TStringList; const Key = '\SYSTEM\CurrentControlSet\Enum\DISPLAY\'; type IBMString = type Ansistring(1253); var Registry: TRegistry; H, i, j, k : Integer; MonitorName : IBMString; EDID : array [0 .. 127] of Byte; subKeysNames, subKeys : TStringList; begin Result := TStringList.Create; subKeys := TStringList.Create; subKeysNames := TStringList.Create; Registry := TRegistry.Create(KEY_READ); Registry.RootKey := HKEY_LOCAL_MACHINE; try try Registry.OpenKeyReadOnly(Key); Registry.GetKeyNames(subKeysNames); finally Registry.CloseKey; end; for h := 0 to subKeysNames.Count - 1 do begin try Registry.OpenKeyReadOnly(Key + subKeysNames[h]); Registry.GetKeyNames(subKeys); finally Registry.CloseKey; end; for i := 0 to subKeys.Count - 1 do begin try if registry.OpenKeyReadOnly(Key + subKeysNames[h] + '\' + subKeys[i]) then begin if registry.OpenKeyReadOnly(Key + subKeysNames[h] + '\' + subKeys[i] + '\' + 'Device Parameters') then begin Registry.ReadBinaryData('EDID', EDID, 128); Registry.CloseKey; end; MonitorName := ''; for j := 0 to 3 do begin if (EDID[54 + 18 * j] = 0) and (EDID[55 + 18 * j] = 0) and (EDID[56 + 18 * j] = 0) and (EDID[57 + 18 * j] = $FC) and (EDID[58 + 18 * j] = 0) then begin k := 0; while (EDID[59 + 18 * j + k] <> $A) and (k < 13) do Inc(k); SetString(MonitorName, PAnsiChar(@EDID[59 + 18 * j]), k); Break; end; end; Result.Add(MonitorName); end; finally Registry.CloseKey; end; end; end; finally subKeys.Free; Registry.Free; subKeysNames.Free; end; end; end.
-
серийный номер монитора
vitalik ответил vitalik вопрос в Сериализация/Чтение компонентов из ресурсов
В принципе работает. Но почему-то не показывает, не производителя не серийный номер. -
Может так подойдёт? : function GetWMIObject(const objectName: String): IDispatch; var chEaten: Integer; BindCtx: IBindCtx; Moniker: IMoniker; begin OleCheck(CreateBindCtx(0, bindCtx)); OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); end; procedure TForm2.SpeedButton1Click(Sender: TObject); var objWMIService : OLEVariant; colItems : OLEVariant; colItem : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2'); colItems := objWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor','WQL',0); oEnum := IUnknown(colItems._NewEnum) as IEnumVariant; if oEnum.Next(1, colItem, iValue) = 0 then begin Memo1.Lines.Add('Подпись '+(colItem.Caption)); Memo1.Lines.Add('Описание '+(colItem.Description)); Memo1.Lines.Add('Идентификатор устройства '+(colItem.DeviceID)); Memo1.Lines.Add('Manufacturer '+(colItem.MonitorManufacturer)); Memo1.Lines.Add('Тип '+(colItem.MonitorType)); end; end;
-
Как получить модель и серийный номер монитора(firemonkey)? Нашел класс WmiMonitorID и GetMonitorDetails и тип Dword но не пойму как приладить так чтобы выдавали данные о по по которым можно будет идентифицировать монитор но не пойму как приладить так чтобы выдавали данные о по по которым можно будет идентифицировать монитор
-
unit reger; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, Registry,inifiles; type TForm1 =
vitalik ответил vitalik вопрос в Сериализация/Чтение компонентов из ресурсов
Спасибо -
Приложения для ТВ, воспроизводящие аудио, могут продолжать делать это после того, как пользователь возвращается на главный экран или переключается на другое приложение. Для этого приложение должно предоставить карточку Now Playing на главном экране. https://developer.android.com/training/tv/playback/now-playing для теста набросал код, но ничего не происходит. при старте активирую медиасессию CreateMediaSession(optActive: boolean); при старте проигрывания UpdateMediaMetadata('name song', 'artist'); при остановке UpdateMediaMetadata('', ''); что не так? unit AndroidMedia; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils, Androidapi.JNI.Media, Androidapi.JNI.App; procedure CreateMediaSession(optActive: boolean); procedure UpdatePlaybackState(State: Integer); procedure UpdateMediaMetadata(Title, Artist: string); var MediaSession: JMediaSession; implementation uses DateUtils, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; procedure CreateMediaSession(optActive: boolean); var PendingIntent: JPendingIntent; Intent: JIntent; begin if (not optActive) or (Assigned(MediaSession)) then begin if Assigned(MediaSession) then MediaSession.setActive(false); if (not optActive) then exit; end; Intent := TJIntent.JavaClass.init; Intent.setClassName(TAndroidHelper.Context.getPackageName, StringToJString('com.embarcadero.firemonkey.FMXNativeActivity')); PendingIntent := TJPendingIntent.JavaClass.getActivity(TAndroidHelper.Context, 99, Intent, TJPendingIntent.JavaClass.FLAG_UPDATE_CURRENT); MediaSession := TJMediaSession.JavaClass.init(TAndroidHelper.Context, StringToJString('myMediaSession')); MediaSession.setFlags(TJMediaSession.JavaClass.FLAG_HANDLES_MEDIA_BUTTONS or TJMediaSession.JavaClass.FLAG_HANDLES_TRANSPORT_CONTROLS); MediaSession.setSessionActivity(PendingIntent); MediaSession.setActive(True); end; procedure UpdatePlaybackState(State: Integer); var PlaybackState: JPlaybackState_Builder; myPlaybackState: JPlaybackState; begin if not Assigned(MediaSession) then exit; PlaybackState := TJPlaybackState_Builder.JavaClass.init; PlaybackState.setState(State, 0, 1.0, DateTimeToMilliseconds(now)); myPlaybackState:= PlaybackState.build; MediaSession.setPlaybackState(myPlaybackState); end; procedure UpdateMediaMetadata(Title, Artist: string); var MetadataBuilder: JMediaMetadata_Builder; Metadata: Jmedia_MediaMetadata; begin if not Assigned(MediaSession) then exit; if title = '' then begin MediaSession.setMetadata(nil); exit; end; UpdatePlaybackState(TJPlaybackState.JavaClass.STATE_PLAYING); MetadataBuilder := TJMediaMetadata_Builder.JavaClass.init; MetadataBuilder.putString(TJmedia_MediaMetadata.JavaClass.METADATA_KEY_TITLE, StringToJString(Title)); MetadataBuilder.putString(TJmedia_MediaMetadata.JavaClass.METADATA_KEY_ARTIST, StringToJString(Artist)); Metadata := MetadataBuilder.build; MediaSession.setMetadata(Metadata); end; initialization MediaSession := nil; end.
-
подскажите пожалуйста у кого есть опыт, как для андроид\гугл ТВ создать на главном экране канал приложения и добавлять\удалять на нем карточки? как те же кинотеатры, ютуб постят на своей ленте информационные новинки. https://developer.android.com/training/tv/discovery/recommendations-channel не знаю даже как подступиться...
-
В примере с компонентом TGBEGrass из модуля GBE.Grass весь код на С++ стал слегка длиннее (нет with) В примере с компонентом TGBEGrass из модуля GBE.Grass весь код на С++ стал слегка длиннее (нет with) //--------------------------------------------------------------------------- void __fastcall TFormGrass::FormCreate(TObject *Sender) { int i; TGBEGrass *GBEGrass; Randomize(); for (i = 0; i <= 500; i++) { GBEGrass = new TGBEGrass (this); GBEGrass->Position->X = random(40)-20; GBEGrass->Position->Z = random(40)-20; GBEGrass->RotationAngle->Y = random(360); if (i / 10 == 0) GBEGrass->MaterialSource = TextureMaterialSource2; else { if (i / 2 == 0) GBEGrass->MaterialSource = TextureMaterialSource; else GBEGrass->MaterialSource = TextureMaterialSource1; } GBEGrass->Width = 5; GBEGrass->Height = 5; GBEGrass->Depth = 0; GBEGrass->Parent = Dummy; GBEGrass->Temps = 0.1; } } Результат анимации цветов в траве: Результат анимации цветов в траве:
-
Для С++Builder в фирменной коробке RAD Studio поставляется не много 3D графический приложений и работают они не очень. Да и на GetIt пока ничего толком нет для FMX типа GLScene VCL или Unity3D. Японская графическая FMX библиотека Luxophia (https://gitverse.ru/glscene/Luxophia), без дополнительных компонентов, включает лишь пару приложений на С++, остальные – на Delphi. Демосы на основе французских дополнительных к FMX компонентов (https://gitverse.ru/glscene/GBE_3D) тоже все на Delphi, но их достаточно просто можно портировать на С++. Вот пример проекта облаков с настройками движения их по небосводу, который я портировал на С++Builder - https://gitverse.ru/glscene/GBE_3D/content/master/demos/Clouds. Там в репозитории ещё пара десятков проектов, включая поиск кратчайшего пути, и игр. Как быстро и правильно делать портирование с Delphi на С++Builder расскажу в отдельном посте. Заинтересованные приглашаются подключиться к портированию остальных исходников демосов на С++.
-
Не получалось обновить файл. Нашел свою ошибку - вместо UpdateAsset('fcatalog.sqlite', System.IOUtils.TPath.GetPublicPath) нужно UpdateAsset('fcatalog.sqlite', System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetPublicPath,'fcatalog.sqlite')). Подумал, что FilePath это путь, а не путь с файлом.
-
Столкнулся с тем, что MenuItem, у которого есть дочерние элементы, почему-то теряет Hint. При наведении мыши на элемент, родной Hint на мгновение мелькает (я вывожу Hint в Label на StatusBar-е) и тут же заменяется на Hint самой формы. При этом остальные элементы меню, на которые наведена мышь, держат правильный Hint до тех пор, пока не теряют фокус наведения мыши. В остальных элементах MenuItem связан с TAction, у которой и Text и Hint настраиваются при редактировании TActionList. Наткнувшись на это, я попытался создать Action с пустым обработчиком и подключить его в MenuItem, но ничего принципиально не поменялось. Сталкивался ли кто-то с такой ситуацией, и можно ли это как-то поправить? Сразу оговорюсь - возможно, причина проблемы в другом месте, но единственное отличие описываемого MenuItem от остальных - это только наличие в нем дочерних элементов
-
Да конечно вы обновляете программу при старте программа проверяет билд(дату или любые данные которые позволяют узнать что база новее) сохраненный в настройках с текущим билдом(датой и т.д). По другому никак, так как установочный файл и установленная программа к друг другу не имеют ни какого отношения. Почему я писал что я проверяю по билду, мне кажется что так удобнее билд это Integer и его проще сравнивать и узнать легко PackageManager := TAndroidHelper.context.getPackageManager; PackageManager.getPackageInfo(TAndroidHelper.context.getPackageName, 0).versionCode; А дальше смотрим билд в настройках SPStart := TAndroidHelper.Context.getSharedPreferences(OptionsFile, TJContext.JavaClass.MODE_PRIVATE); buildApkInSet := SPStart.getInt(StringToJString('apkBuild'), 0);
-
После того, как обновили программу (apk), билд программы будет только один и его нельзя сравнить. Тогда скорее при запуске программы нужно сравнить дату apk и базы данных на смартфоне. Или использовать дату в настройках. Или возможно что-то не понимаю.
-
Все верно, но только если база обновится при установке новой версии на ту же самую ни чего страшного не произойдет, а вы будете уверены что база у вас в актуальном состоянии. Конечно если вы не обновляете свое приложение каждый час, тогда да будет запуск долгий каждый раз, а так раз в месяц на секунду запуск дольше, думаю пользователи это перенесут, ИМХО сугубо мое мнение.