SQLite数据库在Android设备上的部署路径是什么?

4

按照DocWiki的指导,我将SQLite数据库部署到assets\internal\目录下,并使用以下代码:

SQLConnection1.Params.Values['Database'] := 
TPath.Combine(TPath.GetDocumentsPath, 'myDB.db');

然而,当我尝试访问其中一个表时,它并不存在。

对于SQLite,正确的部署和访问设置是什么?


你能贴更多的代码吗,这样我们就可以看到问题所在了吗?我之前也遇到过类似的问题 - 在Windows上,我看不到任何表格,尽管它们存在于表单设计器中。当我执行应用程序时,数据才会出现。 - Asped
只有在Android上出现了类似的问题,在Windows上是正常的。路径没问题,我已经检查过文件也是可见的。有人在Android上使用TSQLConnection成功了吗? - Sebastian Xawery Wiśniowiecki
你怎么将assets\internal\中的数据库复制到文档路径? - mjn
5个回答

4

我刚刚经历了将SQLite数据库部署到Android应用程序的过程。以下是我的心得体会。

与其将数据库与应用程序一起部署,我选择在连接时创建它,并在需要时创建表。

我还使用TFDConnection组件,而不是TSQLConnection组件。

因此,在TFDConnection的BeforeConnect事件中:


  {$IF DEFINED(IOS) or DEFINED(ANDROID)}

  FDConnection1.Params.Values['Database'] :=
    TPath.GetDocumentsPath + PathDelim + 'MyDatabase.s3db';

  {$ENDIF}

在TFDConnection的AfterConnect事件中:


FDConnection1.ExecSQL('CREATE TABLE IF NOT EXISTS MyTable (myField1 TEXT NOT NULL)');

我刚在模拟器和我的Droid X上测试了这个方法。

同时确保你包含了TFDGUIxWaitCursor和TFDPhysSQLiteDriverLink组件。


1
谢谢,但我需要部署一个现有的数据库。 - Martin Moore
只有在Android上出现了类似的问题,在Windows上是正常的。路径没问题,我已经检查过,文件也是可见的。 - Sebastian Xawery Wiśniowiecki

2

正确的部署集(所有配置 - Android 平台):

Local Name: myDB.db
Remote Path: .\assets\internal\
Remote Filename: myDB.db

BeforeConnection事件必须包含以下代码:

procedure TDM.conSQLiteBeforeConnect(Sender: TObject);
var
    dbPath: string;
begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)}
    dbPath := TPath.Combine(TPath.GetDocumentsPath, 'myDB.db');
{$ENDIF}
    FDConnection1.Params.Values['Database'] := dbPath;
end;

1

Add使用了“System.IOUtils”。

在连接按钮中:

var
  DbYol : string;
begin

DbYol := System.IOUtils.TPath.GetDocumentsPath + PathDelim + 'SqliteDers.s3db';

With FDConnection1 do
begin
LoginPrompt := False;
Params.Clear;
Params.Values['Database'] := DbYol; 
Params.Values['DriverID'] := 'SQLite';
Params.Values['CharacterSet'] := 'utf8'; 
Connected := True; 
// Create new database if no exist
end;

With FDQuery1 do
begin
Active := False; 

Connection := FDConnection1;
SQL.Clear;
SQL.Add( 'CREATE TABLE IF NOT EXISTS DERS (' );
SQL.Add( ' ADI nvarchar(10)');
SQL.Add( ' );');
ExecSQL; 
göre ayarlıyoruz
SQL.Clear;
SQL.Add( 'SELECT');
SQL.Add( ' ADI' );
SQL.Add( ' FROM DERS' );
Active := True;
end;

这是一个带有细节的好例子。

http://www.brsatalay.com/xe5-mobil-uygulamada-sqlite-veritabani-kullanimi


1
请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - Ozan

1
我发现当你进行数据库更改并部署这些更改时,有时设备上的更改不会生效(仅在ANDROID上测试过)。从设备本身卸载应用程序并进行“清新”部署/安装将确保您更改的SQLITE DB随应用程序一起部署。
** 在我看来 - 你只应该在测试/调试时这样做。我完全同意@FLDelphi的帖子,并将在完成后实施他的方法***

首先在Android中卸载一个应用程序。我也遇到了这种情况。 - alitrun

0

我使用了FireDac。

FDConnection1.Params.Values['Database'] := '$(DOC)/QuickQuote.s3db';

我在FDConnection1BeforeConnect中使用它。

同时确保在部署中包含数据库文件。

我遵循了这个教程 点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接