Martin Moore
Martin Moore

Reputation: 733

What path is SQLite database deployment to Android device?

Having followed the DocWiki, I'm deploying my SQLite DB to assets\internal\

and used the following code :

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

However, when I try and access one of the tables it doesn't exist.

What is the correct setup for deployment/access for SQLite?

Upvotes: 4

Views: 13159

Answers (5)

Pax Beach
Pax Beach

Reputation: 2793

Correct set of Deployment (All configurations - Android Platform):

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

Event BeforeConnection have to cantain follow code:

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;

Upvotes: 2

Ryno Coetzee
Ryno Coetzee

Reputation: 517

I've found that when you make DB changes and deploy those changes, the changes sometimes do not take effect on the device (only tested on ANDROID). Uninstalling the app from the device itself and doing a "Fresh" deploy/install will ensure your changed SQLITE DB gets deployed with the App.

** i.m.o - you should only do this for testing/debugging. I totally agree with @FLDelphi 's post and will be implementing his method in my APP once done ***

Upvotes: 1

Barış Atalay
Barış Atalay

Reputation: 25

Add uses “System.IOUtils”

In Connecting button:

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;

This is good example with details.

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

Upvotes: 1

Grant Fullen
Grant Fullen

Reputation: 1

I used FireDac .

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

I use this on the FDConnection1BeforeConnect .

All so be sure to include the database file in the Deploment.

I followed this TUT Click Here

Upvotes: 0

FLDelphi
FLDelphi

Reputation: 608

I just went through deployment of an SQLite database to an android app. Here's what I've learned.

Instad of deploying my database with the app, I create it on connect and then create the tables if they don't exist.

I also use the TFDConnection component instead of the TSQLConnection component.

So on TFDConnection BeforeConnect:


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

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

  {$ENDIF}

And on TFDConnection AfterConnect:


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

I just tested this method on the emulator, and my Droid X.

Also make sure you're including the TFDGUIxWaitCursor, and TFDPhysSQLiteDriverLink components.

Upvotes: 4

Related Questions