使用 IONIC 3 + CORDOVA 在 SQLite 中创建数据库

Posted

技术标签:

【中文标题】使用 IONIC 3 + CORDOVA 在 SQLite 中创建数据库【英文标题】:Create Database in SQLite with IONIC 3 + CORDOVA 【发布时间】:2019-01-28 06:05:02 【问题描述】:

我正在使用 SQLite 开发一个应用程序,用于创建和列出用户...

为此我创建了一个服务,在该服务中我创建了数据库和两个方法(create 和 list),应该提到没有错误,并且我已经正确导入了所有内容

数据库.ts:

@Injectable()
export class DatabaseProvider 

  private db: SQLiteObject;
  private isOpen: boolean;

  constructor(
    public http: Http,
    public storage: SQLite) 

      if(!this.isOpen)
        this.storage = new SQLite();
        this.storage.create( name: "data.db", location:"default" ).then((db:SQLiteObject) => 
          this.db = db;
          db.executeSql("CREATE TABLE IF NOT EXIST usuarios (Codigo INTEGER PRIMARY KEY AUTOINCREMENT, Identificacion INTEGER, Nombre TEXT, Apellido TEXT)", []);
          this.isOpen = true;
        ).catch((error) => 
          console.log(error);
        )
      
      

crearUsuario(Identificacion:number, Nombre:string, Apellido:string)
  return new Promise ((resolve , reject) => 
    let sql = "INSERT INTO usuarios (Identificacion, Nombre, Apellido) VALUES (?, ?, ?)";
    this.db.executeSql(sql, [Identificacion, Nombre, Apellido]).then((data) => 
      resolve(data);
    , (error) => 
      reject(error);
    );  
  );


listarUsuario()
  return new Promise ((resolve , reject) => 
    this.db.executeSql("SELECT * FROM usuarios", []).then((data) => 
      let arrayUsuarios = [];
      if(data.rows.length > 0)
        for (var i=0; i < data.rows.length; i++)
          arrayUsuarios.push(
            Codigo: data.rows.item(i).Codigo,
            Identificacion: data.rows.item(i).Identificacion,
            Nombre: data.rows.item(i).Nombre,
            Apellido: data.rows.item(i).Apellido,
          );
        
      
      resolve(arrayUsuarios);
    , (error) => 
      reject(error);
    )
  );



在我看来 home.html 我有一个表单和两个按钮...一个列出用户,另一个创建表单的用户

home.html:

<button ion-button block color="secondary" (click)="listarUsuario()">Listar Usuario</button>

<form [formGroup]="todo" (ngSubmit)="crearUsuario()" novalidate>
  <ion-item>
    <ion-label>Nombre</ion-label>
    <ion-input type="text" formControlName="Nombre"></ion-input>
  </ion-item>
  <ion-item *ngIf="todo.get('Nombre').errors && todo.get('Nombre').dirty">     
  </ion-item>
  <ion-item>
    <ion-label>Apellido</ion-label>
    <ion-input type="text" formControlName="Apellido"></ion-input>
  </ion-item>
  <ion-item *ngIf="todo.get('Apellido').errors && todo.get('Apellido').dirty">      
  </ion-item>
  <ion-item>
    <ion-label>Indentificación</ion-label>
    <ion-input type="text" formControlName="Identificacion"></ion-input>
  </ion-item>
  <button ion-button block type="submit" [disabled]="!todo.valid">Crear Usuario</button>
</form>

<ion-list>
  <ion-item-sliding *ngFor="let item of listaPersonas">
    <ion-item>      
      <h2>item.Nombre - item.Apellido</h2>     
    </ion-item>   
    <ion-item-options side="right">
      <button ion-button color="danger">
        <ion-icon name="delete"></ion-icon>
        Eliminar
      </button>
    </ion-item-options> 
  </ion-item-sliding>
</ion-list>

我的控制器有以下代码:

home.ts:

export class HomePage 

  private listaPersonas: any;
  private todo: FormGroup;

  constructor(public navCtrl: NavController, private database: DatabaseProvider, private formBuilder: FormBuilder) 

    this.todo = this.formBuilder.group(
      Nombre: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(8)]],
      Apellido: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(8)]],
      Identificacion: ['', Validators.required],
    );

   

  crearUsuario()
    console.log(this.todo);

      this.database.crearUsuario(this.todo.value.Identificacion, this.todo.value.Nombre, this.todo.value.Apellido).then((data) => 
        console.log(data);
        this.listarUsuario();
      , (error) => 
        console.log(error);
      ) 
    

  listarUsuario()
    this.database.listarUsuario().then((data: any) => 
      console.log(data);
      this.listaPersonas = data;
    , (error) => 
      console.log(error);
    )
      


我正在物理设备上测试我的应用程序,但它没有做任何事情......不要创建,不要列出用户,我想我没有创建数据库,我是 IONIC 3 的新手,并且要在物理设备上部署我的应用程序,我首先使用命令ionic cordova build android 构建,然后使用命令ionic cordova run android --device 在手机上部署我的应用程序

我做错了什么?如何通过在物理设备上尝试我的应用程序来找到错误?用我的调试控制台? Ionic 3 数据库物理存储在我的设备(目录)中的什么位置?对我有什么帮助吗?

【问题讨论】:

【参考方案1】:

我相信您的问题是 :-

的语法
CREATE TABLE IF NOT EXIST usuarios (Codigo INTEGER PRIMARY KEY AUTOINCREMENT, Identificacion INTEGER, Nombre TEXT, Apellido TEXT)

错了。

即关键字是 EXISTS 而不是 EXIST。我建议尝试/使用:-

db.executeSql("CREATE TABLE IF NOT EXISTS usuarios (Codigo INTEGER PRIMARY KEY AUTOINCREMENT, Identificacion INTEGER, Nombre TEXT, Apellido TEXT)", []); 

【讨论】:

【参考方案2】:

要在 sqlite 中创建表,您需要先创建存储。你可以这样做:

 if (this.platform.is('cordova'))
          this.sqlite.create(
            name: 'fundamentos.offline',
            location: 'default'
          )
.then((db: SQLiteObject) => 
    db.executeSql(CREATE TABLE IF NOT EXIST usuarios 
    (Codigo INTEGER PRIMARY KEY AUTOINCREMENT, Identificacion INTEGER, 
     Nombre TEXT, Apellido TEXT),[])
    .then(() => console.log('Table Created'))
    .catch(e => 
                console.error(JSON.stringify(e));
              );`

供参考: https://ionicframework.com/docs/native/sqlite/ https://www.djamware.com/post/59c53a1280aca768e4d2b143/ionic-3-angular-4-and-sqlite-crud-offline-mobile-app

【讨论】:

以上是关于使用 IONIC 3 + CORDOVA 在 SQLite 中创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

Ionic 3/Cordova:应用程序通过 Ionic CLI 而不是通过 Xcode 运行(在 Xcode 中构建成功)

使用 ionic-v3 和 cordova 6.3.0 警告 Android API 级别 28

升级到 Ionic 1.3 后,Ionic/Cordova 联系人插件在 iOS 上返回 Invalid Date

如何将 Ionic Cordova 3 迁移到 Ionic Cordova 5?

Ionic2使用第三方cordova插件(非Ionic2官方支持的native cordova插件)

Ionic 3 cordova 遇到设备/模拟器错误 [Android]