воскресенье, 26 января 2014 г.

Несколько особенностей и вопросы по ним

Несколько особенностей (с примерами) и вопросов по работе с SQLite на Android устройствах
1) Если назвать приложение «sqlite», то при запуске оно будет тут же падать с табличкой «Приложение sqlite остановлено». При этом с названием «SQLite» всё рабоатет...
2) БД SQLite: Обновление sqlite файла при обновлении приложения.
Общее описание:
Вот ситуация, предположим, я не собираюсь выкладывать приложение в маркет, т.е. пользоваться им будет ограниченный круг лиц. Я обновляю базу, деплою новую версию базы в проект, компилю и раздаю ограниченному кругу лиц новый .APK файл. Но после установки, они не видят новые данные.
Вопрос №2 решил в статье Обновляем файл базы данных без перезапуска приложения


Подробно:
Предположим, у нас есть приложение использующее базу данных SQLite (dbExpress). Т.е. в наш apk файл мы задеплоили файл ".\assets\internal\test.s3db", который содержит 100 записей и установили приложение на устройство.
Через некоторое время мы выпускаем новую версию приложения с изменённым (добавили новый записи, удалили/изменили старые) файлом ".\assets\internal\test.s3db", который теперь содержит 110 записей.
Мы закидываем новый .apk файл на устройство и начинаем установку. После установки запускаем приложение и видим, что база не обновилась, т.е. приложение продолжает видеть только 100 записей!

Если вы идете в "Диспетчер приложений", выбираете наше приложение и нажимаете на "Clear Data", то при запуске, приложение начинает видеть новый файл базы данных(110 записей).

Проверил на Delphi XE5 Update 2. База всё также не хочет обновляться, т.е. видит старый файл базы, пока в диспетчере приложений не нажмёшь Clear Data. :( Я даже не знаю, что и думать… Либо я что-то упускаю из внимания, либо это БАГ.

Думаю, стоит упомянуть тот факт, что на форуме https://forums.embarcadero.com/message.jspa?messageID=607618#607618 мне помочь ни кто не смог .(!473 просмотра!)

Вопросы: Как обновить базу? (Знающие люди, подскажите, пожалуйста) Как узнать версию базы?

Прикладываю архив с примером. Скачать с Google Drive
В архиве два apk файла «testsqlite2.apk» и «testsqlite3.apk», отличаются количеством записей в базе(2-е и 3-и записи).
Попробуйте установить сначала «testsqlite2.apk», запустить и нажать на кнопку «Button1», в Label высветится количество записей в базе (2), теперь просто закройте приложение. Закиньте «testsqlite3.apk» на устройство, установите и нажмите «открыть», далее нажмите опять кнопку «Button1», в Label высветится количество записей в базе (2, а должно быть 3).

Код приложения:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, Data.DbxSqlite,
  Data.DB, Data.SqlExpr, Data.FMTBcd, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    test_connect: TSQLConnection;
    SQLQuery1: TSQLQuery;
    Label1: TLabel;
    Button1: TButton;
    procedure test_connectBeforeConnect(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
  System.IOUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
    SQLQuery1.Active := True;
    SQLQuery1.Open;
    Label1.Text := SQLQuery1.FieldByName('allcount').AsString;
    SQLQuery1.Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    test_connect.Connected := True;
end;

procedure TForm1.test_connectBeforeConnect(Sender: TObject);
begin
  test_connect.Params.Values['Database'] := TPath.GetDocumentsPath + PathDelim + 'test.db';
end;

end.



p.s. Если задаю простой вопрос, то всё равно прошу ткните туда, где можно почитать про это…

3 комментария:

  1. Если назвать приложение «sqlite»...
    Это хорошо, да :)

    ОтветитьУдалить
  2. Как я понимаю это как раз не глюк, а очень нужная штука. Дело в том, что обычно в базах данных SQLLite хранятся текущие настройки пользователя, его избранные, пароли входа, сейвы и т.д. Поэтому по умолчанию при обновления приложения файлы находящиеся в assets\internal не заменяются на новые версии, именно для того, чтобы случайно не сбросить сохраненные в этих файлах данные пользователя. Если же удалить приложение и поставить заново, то естественно будет взят новый файл, но опять же все настройки пользователя будут утеряны. По идее конечно должна существовать инструкция принудительной замены определенных файлов на новые версии при обновлении, но есть ли она и как ее использовать не знаю. Пока я вижу лишь выход сохранения 2-х версий БД. Новая версия БД должна отличаться в названии от старой. Она будет скопирована на устройство. При первом запуске программа ищет старую базу и если находит подтягиваются данные в новую. Старая удаляется. Новая база принимает имя старой. И уже начинается нормальная работа приложения. При следующем обновлении процесс повторяется.

    ОтветитьУдалить
  3. А если при запуске обновленной программы добавлять записи в существующую базу? В ресурсы apk добавить файл с изменениями, и потом с этого файла в базу на смартфоне заносить новые данные.

    ОтветитьУдалить