首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按Sqflite删除颤动(省道)

按Sqflite删除颤动(省道)
EN

Stack Overflow用户
提问于 2020-12-15 04:09:19
回答 2查看 955关注 0票数 1

我需要帮助:

我正在尝试从Sqflite数据库中删除数据。我可以插入并显示数据,但如果在保存数据时出错,则无法将其删除。

我有我的数据库:

代码语言:javascript
复制
import 'package:sqflite/sqflite.dart' as sql;
import 'package:path/path.dart' as path;
import 'package:sqflite/sqflite.dart';

//SQFLITE
class DBHelper {
  static Future<sql.Database> database() async {
    final dbPath = await sql.getDatabasesPath();

    //einmal die Datenbank erstellen in einer Variablen
    return sql.openDatabase(path.join(dbPath, 'wanderwege.db'),
        onCreate: (db, version) {
      return db.execute(
          'CREATE TABLE user_places(id TEXT PRIMARY KEY, title TEXT, image TEXT, createTime TEXT, place TEXT, description TEXT)');
      // 'CREATE TABLE user_places(id TEXT PRIMARY KEY, title TEXT, image TEXT, loc_lat REAL, loc_lng REAL, address TEXT)');
    }, version: 1);
  }

//Da der Eintrag dauern kann bis es in die Daten gespeichert weerden = Future + async
  static Future<void> insert(String table, Map<String, Object> data) async {
    final db = await DBHelper.database();

    db.insert(table, data, conflictAlgorithm: sql.ConflictAlgorithm.replace);
  }

  // Delete data from table
 // deleteData(table, itemId) async {
   // final db = await DBHelper.database();
   // return await db.rawDelete("DELETE FROM $table WHERE id = $itemId");
 // }

  //Methode um Einträge zu holen
  static Future<List<Map<String, dynamic>>> getData(String table) async {
    final db = await DBHelper.database();
    return db.query(table);
  }
}

然后我就有自己的位置了:

代码语言:javascript
复制
import 'dart:io';

import 'package:flutter/widgets.dart';
import 'package:places/helpers/db_helper.dart';

import 'package:places/models/place.dart';
import 'package:intl/intl.dart';

class GreatPlaces with ChangeNotifier {
  //To set Creation Time
  static DateTime actualTime = DateTime.now();
  String formattedDate = DateFormat('dd-MM-yyyy').format(actualTime);

  List<Place> _items = [];

  List<Place> get items {
    return [..._items];
  }

  //Information des gesamten places
  Place findById(String id) {
    return items.firstWhere((place) => place.id == id);
  }

  Future<void> addPlace(
    String pickedTitle,
    File pickedImage,
    String pickedDate,
    String pickedLocation,
    String pickedDescription,
    //PlaceLocation pickedLocation,
  ) async {
    //final address = await LocationHelper.getPlaceAddress(
    //  pickedLocation.latitude, pickedLocation.longitude);
    //   final updatedLocation = PlaceLocation(
    //    latitude: pickedLocation.latitude,
    //   longitude: pickedLocation.longitude,
    //    address: address);
    final newPlace = Place(
      id: DateTime.now().toString(),
      image: pickedImage,
      title: pickedTitle,
      createTime: pickedDate,
      place: pickedLocation,
      description: pickedDescription,
    );
    //location: null);
    _items.add(newPlace);
    notifyListeners();
    //übergabe 'wanderwege' so wie in db_helper definiert , Data ist von typ map
    DBHelper.insert('user_places', {
      'id': newPlace.id,
      'title': newPlace.title,
      'image': newPlace.image.path,
      'createTime': newPlace.createTime,
      'place': newPlace.place,
      'description': newPlace.description
      // 'loc_lat': newPlace.location.latitude,
      //  'loc_lng': newPlace.location.longitude,
      //  'address': newPlace.location.address,
    });
  }

  //Die ganzen places aus der DB holen
  Future<void> fetchAndSetPlaces() async {
    final dataList = await DBHelper.getData('user_places');
    _items = dataList
        .map((item) => Place(
              id: item['id'],
              title: item['title'],
              image: File(item['image']),
              createTime: item['createTime'],
              place: item['place'],
              description: item['description'],
              //location: null // latitude: item['loc_lat'],
              // longitude: item['loc_lat'],
              // address: item['address']),
            ))
        .toList();
    notifyListeners();
  }
}

现在在屏幕上列出了我想要实现删除功能的所有位置,但我不知道它是如何工作的……我在youtube和Sqflite的文档上尝试了这么多,但我不明白。

我希望有人能帮助我。

问候:)

EN

回答 2

Stack Overflow用户

发布于 2020-12-15 04:42:13

我已经为一个使用sqflite作为本地后端的小应用程序创建了这个简单的帮助文件(就像你做的那样)。它是完整的:它访问本地文件系统以获得授权权限,它打开文件进行写入,您还可以进行批量更新:

代码语言:javascript
复制
import 'dart:async';

import 'package:sqflite/sqflite.dart';

class DBClient  {
  final logger = Log.getLogger('\u{1F5AB} DBClient '); // a little logger utility, you can substitute with the simple 'print(...)' function.
  static final String dbFilename = 'my_database.db';
  final Permission permission;
  Database _database;
  bool openingDB = false;

  DBClient(this.permission) : assert(permission != null);

  Batch batch() {
    return _database.batch();
  }

  Future<void> init() async {
    if (_database == null && !openingDB) {
      String path;
      try {
        path = await permission.getAbsoluteFileName(dbFilename);
      } on Error {
        logger.e('Error: cannot open db');
        rethrow;
      }
      openingDB = true;
      logger.d('Opening database on path: $path');

      _database = await openDatabase(path, version: 1,
          onCreate: (Database db, int version) async {

        await db.execute("""
                CREATE TABLE IF NOT EXISTS  ...... 
          """);
        await db.execute("""
      CREATE TABLE IF NOT EXISTS .... 
        """);
        ....
        await db.execute("""
      CREATE TABLE IF NOT EXISTS .... 
        """);
      });
    }
  }

  Future<int> insert(String tableName, Map<String, dynamic> json) async =>
      _database.insert(tableName, json);

  Future<List<Map<String, dynamic>>> query(
    String tableName, {
    String where,
    List<dynamic> whereArgs,
  }) async {
    return _database.query(
      tableName,
      where: where,
      whereArgs: whereArgs,
    );
  }

  Future<int> update(String tableName, Map<String, dynamic> json,
      {String where, List<dynamic> whereArgs}) async {
    return _database.update(
      tableName,
      json,
      where: where,
      whereArgs: whereArgs,
    );
  }

  Future<int> delete(String tableName,
      {String where, List<dynamic> whereArgs}) async {
    return _database.delete(
      tableName,
      where: where,
      whereArgs: whereArgs,
    );
  }
}

您可以通过以下方式使用:

代码语言:javascript
复制
  deleted = await db.delete(Place.tableName(),
      where: "name = ?", whereArgs: [name]);

提示:在init()方法中,您可以使用AsyncMemoizer类,最好只允许该方法调用一次(在我编写应用程序的时候,我还没有这样做……)

下面是我的(非常旧的)依赖关系:

代码语言:javascript
复制
dependencies:
  date_utils: ^0.1.0+3
  equatable: ^1.1.1
  logger: ^0.8.3
  permission_handler: ^5.0.0+hotfix.3
  quiver: ^2.1.3
  sqflite: ^1.3.0
  path_provider: ^1.6.5
  flutter:
    sdk: flutter
票数 0
EN

Stack Overflow用户

发布于 2021-10-30 17:57:30

只需使用以下命令:

代码语言:javascript
复制
await db.rawDelete('DELETE FROM $table WHERE id = ?',[itemId],);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65295761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档