Перейти к содержанию
Fire Monkey от А до Я
  • 0

Новая БД в Android


dervish00

Вопрос

Обязательно ли деплоить пустую БД с приложением на устройство или можно при первом запуске просто создать новую БД? Как добавить таблицу в существующую БД более/менее понятно из wiki, а вот как создать БД - так и не понял. Вроде перерыл интернет на эту тему, но так и не нашел. Может кто сталкивался? Буду благодарен за ответы по существу вопроса.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
16 часов назад, dervish00 сказал:

Обязательно ли деплоить пустую БД с приложением на устройство или можно при первом запуске просто создать новую БД? Как добавить таблицу в существующую БД более/менее понятно из wiki, а вот как создать БД - так и не понял. Вроде перерыл интернет на эту тему, но так и не нашел. Может кто сталкивался? Буду благодарен за ответы по существу вопроса.

Стандартные компоненты, аля xxxConnection, поддерживают создание БД.

В Android SDK есть библиотека, для работы с SQLite, можно использовать ее. Об этом можно прочитать здесь, подзаголовок «Создание базы данных с помощью SQL Helper», и я на форуме писал ранее по теме.

 

Ссылка на комментарий
  • 0

Pax Beach

 

Спасибо за ответ. Начал копать в этом направлении (к сожалению, в силу некоторых рабочих процессов, не могу уделить сейчас этому много времени). Добавил к приложению (просто пустая форма) модуль, на который посадил два компонента. Вот код:

unit DMUnit;

interface

uses
  System.SysUtils, System.Classes, Data.DbxSqlite, Data.DB, Data.SqlExpr,
  Data.FMTBcd, System.IOUtils;

type
  TDM = class(TDataModule)
    Conn: TSQLConnection;
    DS: TSQLDataSet;
    procedure ConnBeforeConnect(Sender: TObject);
    procedure ConnAfterConnect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DM: TDM;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

procedure TDM.ConnAfterConnect(Sender: TObject);
begin
   Conn.ExecuteDirect('CREATE TABLE IF NOT EXISTS tbl1 (_id INTEGER, name TEXT, PRIMARY KEY (_id ASC)');
end;

procedure TDM.ConnBeforeConnect(Sender: TObject);
begin
   {$IF DEFINED(iOS) or DEFINED(ANDROID)}
      Conn.Params.Values['ColumnMetadataSupported'] := 'False';
      Conn.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'test.db');
   {$ENDIF}
end;

begin
   DM.Conn.Connected := True;
end.

при старте приложение сразу вылетает. Если закамментить:

begin
//   DM.Conn.Connected := True;
end.

то стартует нормально, но БД, естественно, не создается... Что не так? Вроде все просто и прозрачно.

Изменено пользователем dervish00
Ссылка на комментарий
  • 0
  FDConnection1 := TFDConnection.Create(Self);
  FDPhysSQLiteDriverLink1 := TFDPhysSQLiteDriverLink.Create(Self);
  FDGUIxWaitCursor1 := TFDGUIxWaitCursor.Create(Self);
  FDGUIxWaitCursor1.ScreenCursor := gcrSQLWait;
  FDGUIxWaitCursor1.Provider := 'FMX';
  FDConnection1.DriverName := 'SQLite';
  FDConnection1.Params.Values['Database'] :=
    TPath.GetDocumentsPath + PathDelim + 'test.db';
  FDConnection1.LoginPrompt := false;
  FDConnection1.Connected := true;
  if FDConnection1.Connected then
    ShowMessage('подключились');

Пример подключения в runtime. Компоненты на форму можно "не садить"

Ссылка на комментарий
  • 0

enatechno

Спасибо. Красиво и легко. Я, правда, уже порешал у себя. Все получилось. Оказывается, нельзя в ДатаМодуле инициализировать. Сделал это в OnCreate главной формы - все заработало.

Ссылка на комментарий
  • 0
7 минут назад, dervish00 сказал:

 

Оказывается, нельзя в ДатаМодуле инициализировать. 

Можно. Приведенный мною текст может быть использован TDM.DataModuleCreate(Sender: TObject).
Ваша ошибка была в том, что вы обращались к экземпляру класса 

DM.Conn.Connected := True;

а сам экземпляр DM не создали.

Ссылка на комментарий
  • 0
7 минут назад, enatechno сказал:

Можно. Приведенный мною текст может быть использован TDM.DataModuleCreate(Sender: TObject).
Ваша ошибка была в том, что вы обращались к экземпляру класса 


DM.Conn.Connected := True;

а сам экземпляр DM не создали.

да, точно, спасибо. вот что значит отсутствие практики... "давно не брал я в руки шашку" (с). попробовал - работает. 

Ссылка на комментарий
  • 0

Привет всем!

Вопрос в тему. Недавно на практике столкнулся с неприятным моментом: сам использовал описанный выше способ создания новой базы приложением.

Но на некоторых устройствах база не формировалась. Лишь на некторых! 

В коде ошибок нет: эти случаи - большая редкость (всего известно 2 из более 1 000 установок)

Никто не сталкивался с таким? Антивирусов и программ, которые могли бы оказать подавляющее действие на этих девайсах нет. ОС на обоих - Android 5.1

В чем может быть причина? Понимаю, вопрос абстрактный, но большей информации нет :(

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...