【问题标题】:What path is SQLite database deployment to Android device?SQLite 数据库部署到 Android 设备的路径是什么?
【发布时间】:2013-09-18 16:50:35
【问题描述】:

遵循DocWiki,我正在将我的 SQLite DB 部署到 assets\internal\

并使用以下代码:

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

但是,当我尝试访问其中一个表时,它不存在。

SQLite 部署/访问的正确设置是什么?

【问题讨论】:

  • 您能否粘贴更多代码,以便我们查看问题?我有一个类似的 - 在 Windows 上,我没有看到任何表格,虽然它们在那里,但只在表单设计器中。当我执行应用程序时,数据就在那里。
  • 只有安卓有类似的问题,windows也可以。路径没问题,我检查了,文件是可见的。有人在 Android 上使用 TSQLConnection 吗?
  • 如何将数据库从 `assets\internal` 复制到文档路径?

标签: android sqlite delphi firemonkey delphi-xe5


【解决方案1】:

我刚刚完成了将 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 组件。

【讨论】:

  • 谢谢,但我需要部署一个现有的数据库。
  • 只有安卓有类似的问题,windows也可以。路径没问题,我检查了,文件是可见的。
【解决方案2】:

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

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

Event 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;

【讨论】:

    【解决方案3】:

    添加使用“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

    【讨论】:

    • 请注意,不鼓励link-only answers,所以答案应该是搜索解决方案的终点(与另一个参考文献的中途停留相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    【解决方案4】:

    我发现当您进行数据库更改并部署这些更改时,更改有时不会在设备上生效(仅在 ANDROID 上测试过)。从设备本身卸载应用程序并执行“全新”部署/安装将确保您更改的 SQLITE DB 与应用程序一起部署。

    ** i.m.o - 你应该只在测试/调试时这样做。我完全同意@FLDelphi 的帖子,一旦完成,我将在我的应用程序中实施他的方法***

    【讨论】:

    • 首先卸载Android中的一个应用。我也遇到过这种情况。
    【解决方案5】:

    我使用了 FireDac。

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

    我在 FDConnection1BeforeConnect 上使用它。

    所以一定要在部署中包含数据库文件。

    我关注了这个 TUT Click Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 2012-04-17
      • 1970-01-01
      • 2016-05-23
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      相关资源
      最近更新 更多