2014-03-06 2 views
2

Я пытаюсь развернуть приложение для запуска на эмуляторе Android, используя delphi, который использует базу данных SQLite и заполняет выпадающий список с результатами запроса.Развертывание базы данных SQLite для Android с помощью Delphi XE5

Я протестировал весь код в приложении Win32, и все работает по назначению, однако, когда я развертываю базу данных SQLite и пытаюсь запустить приложение в эмуляторе, я создаю исключение с «TDBXError with message» и ErrorMessage содержит «нет такой таблицы: автомобили»

Ниже приводится код для моей формы.

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    // Populate Manufacturer box 
    SQLConnection1.Connected := True; 
    SQLQuery1.SQL.Clear; 
    SQLQuery1.Close; 
    SQLQuery1.SQL.Add('SELECT DISTINCT manufacturer FROM cars'); 
    try 
    SQLQuery1.Open; 
    cbManufac.Items.Clear; 
    while not SQLQuery1.Eof do 
    begin 
     cbManufac.Items.Add(SQLQuery1.Fields[0].AsString); 
     SQLQuery1.Next; 
    end; 
    finally 
    SQLQuery1.Close; 
    end; 
end; 

procedure TForm1.SQLConnection1BeforeConnect(Sender: TObject); 
begin 
    {$IF DEFINED(iOS) or DEFINED(ANDROID)} 
    SQLConnection1.Params.Values['ColumnMetadataSupported'] := 'False'; 
    SQLConnection1.Params.Values['Database'] := 
     System.IOUtils.TPath.Combine(TPath.GetDocumentsPath, 'cars.sqlite'); 
    {$ENDIF} 
end; 

end. 

Я удостоверился, System.IOUtils добавляются к использованию, и мой файл базы данных добавляются в моих проектах настройки развертывания.

Если я активирую Win32 и проверяю приложение, то записи combobox добавляются просто отлично.

В виде конструктора я использую TSQLConnection и TSQLQuery

Может кто-нибудь мне точку в правильном направлении.

Благодаря

ответ

2

В диспетчере развертывания, установить удаленный путь для вашей базы данных в assets\external. (См documentation here разницу между assets\internal и assets\external.)

Изменить код BeforeConnect событий для:

procedure TForm1.SQLConnection1BeforeConnect(Sender: TObject); 
begin 
    {$IF DEFINED(iOS) or DEFINED(ANDROID)} 
    SQLConnection1.Params.Values['ColumnMetadataSupported'] := 'False'; 
    SQLConnection1.Params.Values['Database'] := 
     TPath.Combine(TPath.GetSharedDocumentsPath, 'cars.sqlite'); 
    {$ENDIF} 
end; 

Чтобы увидеть физическое расположение TPath.GetSharedDocumentsPath и других мест, см Standard RTL Path Functions Across the Supported Target Platforms.

+0

Я сделал редактирование с помощью ресурсов \ external, потому что он терпит неудачу, и вы снова удаляете мои изменения. –

Смежные вопросы