Flutter sqflite app does not working on real ios device

蓝咒 提交于 2021-02-10 00:31:16

问题


I have a flutter app using sqflite database. It works perfectly on android emulator and device, also working on ios simulator. on ios real device it works but does not save or retrieve data just static empty UI I use xcode 10.1, and ios 11.2.6 on iphone 6 and ios 12.1.4 on iphone 5s.

    import 'package:sqflite/sqflite.dart';
import 'dart:async';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_app/models/note.dart';

class DatabaseHelper {

    static DatabaseHelper _databaseHelper;    // Singleton DatabaseHelper
    static Database _database;                // Singleton Database

    String noteTable = 'note_table';
    String colId = 'id';
    String colTitle = 'title';
    String colDescription = 'description';
    String colPriority = 'priority';
    String colDate = 'date';

    DatabaseHelper._createInstance(); // Named constructor to create instance of DatabaseHelper

    factory DatabaseHelper() {

        if (_databaseHelper == null) {
            _databaseHelper = DatabaseHelper._createInstance(); // This is executed only once, singleton object
        }
        return _databaseHelper;
    }

    Future<Database> get database async {

        if (_database == null) {
            _database = await initializeDatabase();
        }
        return _database;
    }

    Future<Database> initializeDatabase() async {
        // Get the directory path for both Android and iOS to store database.
        Directory directory = await getApplicationDocumentsDirectory();
        String path = directory.path + 'notes.db';

        // Open/create the database at a given path
        var notesDatabase = await openDatabase(path, version: 1, onCreate: _createDb);
        return notesDatabase;
    }

    void _createDb(Database db, int newVersion) async {

        await db.execute('CREATE TABLE $noteTable($colId INTEGER PRIMARY KEY AUTOINCREMENT, $colTitle TEXT, '
                '$colDescription TEXT, $colPriority INTEGER, $colDate TEXT)');
    }

    // Fetch Operation: Get all note objects from database
    Future<List<Map<String, dynamic>>> getNoteMapList() async {
        Database db = await this.database;

//      var result = await db.rawQuery('SELECT * FROM $noteTable order by $colPriority ASC');
        var result = await db.query(noteTable, orderBy: '$colPriority ASC');
        return result;
    }

    // Insert Operation: Insert a Note object to database
    Future<int> insertNote(Note note) async {
        Database db = await this.database;
        var result = await db.insert(noteTable, note.toMap());
        return result;
    }

    // Update Operation: Update a Note object and save it to database
    Future<int> updateNote(Note note) async {
        var db = await this.database;
        var result = await db.update(noteTable, note.toMap(), where: '$colId = ?', whereArgs: [note.id]);
        return result;
    }

    // Delete Operation: Delete a Note object from database
    Future<int> deleteNote(int id) async {
        var db = await this.database;
        int result = await db.rawDelete('DELETE FROM $noteTable WHERE $colId = $id');
        return result;
    }

    // Get number of Note objects in database
    Future<int> getCount() async {
        Database db = await this.database;
        List<Map<String, dynamic>> x = await db.rawQuery('SELECT COUNT (*) from $noteTable');
        int result = Sqflite.firstIntValue(x);
        return result;
    }

    // Get the 'Map List' [ List<Map> ] and convert it to 'Note List' [ List<Note> ]
    Future<List<Note>> getNoteList() async {

        var noteMapList = await getNoteMapList(); // Get 'Map List' from database
        int count = noteMapList.length;         // Count the number of map entries in db table

        List<Note> noteList = List<Note>();
        // For loop to create a 'Note List' from a 'Map List'
        for (int i = 0; i < count; i++) {
            noteList.add(Note.fromMapObject(noteMapList[i]));
        }

        return noteList;
    }

}

this code is a tutorial on youtube and it works fine on android and ios simulator only


回答1:


I found this answer on github github

import 'package:path/path.dart' as p;

Future<Database> initializeDatabase() async {
    //Get path of the directory for android and iOS.

    var databasesPath = await getDatabasesPath();
    String path = p.join(databasesPath, 'cards.db');

    //open/create database at a given path
    var cardDatabase = await openDatabase(path, version: 1, onCreate: _createDb);

    return cardDatabase;

  }

Add package in pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  path: any



回答2:


I run into same issue. You may use path_provider package but then, for ios, you also have to use path_provider_macos package

path_provider: ^1.6.1
path_provider_macos: ^0.0.1

I also switched to path package.




回答3:


First remove path_provider from yaml file and add

  path: any

into your .yaml file. Now in the database helper class add this import

import 'package:path/path.dart' as p;

and create a database path like this one

Future<Database> initializedDatabase() async {

var directory = await getApplicationDocumentsDirectory();
String path = p.join(directory.toString(),"imo.db");

/// create the database
var notesDatabase = await openDatabase(path, version: 1, onCreate: _createDatabase);
return notesDatabase;
 }


来源:https://stackoverflow.com/questions/55207234/flutter-sqflite-app-does-not-working-on-real-ios-device

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!