问题描述
我有一个使用sqflite数据库的Flutter应用程序.它可以完美地在android模拟器和设备上运行,也可以在ios模拟器上运行.在ios真实设备上可以正常工作,但不能保存或检索数据,而只是静态的空UI我在iPhone 6上使用xcode 10.1和ios 11.2.6,在iPhone 5s上使用ios 12.1.4.
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 UII 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;
}
}
此代码是youtube上的教程,仅在android和ios模拟器上可以正常工作
this code is a tutorial on youtube and it works fine on android and ios simulator only
推荐答案
我在github上找到了这个答案 github
I found this answer on githubgithub
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;
}
在pubspec.yaml中添加软件包
Add package in pubspec.yaml
dependencies:
flutter:
sdk: flutter
path: any
这篇关于Flutter sqflite应用程式无法在真正的iOS装置上运作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!