Flutter 데이터베이스 사용 방법
Flutter 원생 은 데이터 베 이 스 를 지원 하지 않 습 니 다.SQLlit 플러그 인 을 사용 하여 데이터 베 이 스 를 사용 하 는 능력 을 가지 게 합 니 다.사실은 Flutter 가 플러그 인 을 통 해 네 이 티 브 시스템 과 소통 하여 데이터 베 이 스 를 조작 하 는 것 입 니 다.
플랫폼 지원
사용 사례
notepad_sqflite iOS/Android/Windows/linux/Mac 에서 실행 할 수 있 는 간단 한 메모 장 응용 프로그램
간단히 사용 하 다
의존 도 를 높이다
SQLite 데이터 베 이 스 를 사용 하기 위해 서 는 먼저 sqflite 와 path 두 패 키 지 를 가 져 와 야 합 니 다.
dependencies:
  sqflite: ^1.3.0
  path:   
쓰다sqflite.dart 가 져 오기
import 'dart:async';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
데이터베이스 열기SQLite 데이터 베 이 스 는 파일 시스템 의 파일 입 니 다.상대 경로 라면 이 경 로 는 getDatabasesPath()에서 얻 은 경로 이 며,이 경 로 는 Android 의 기본 데이터베이스 디 렉 터 리 와 iOS 의 documens 디 렉 터 리 와 연 결 됩 니 다.
var db = await openDatabase('my_db.db');
많은 경우 에 우 리 는 데이터 베 이 스 를 사용 할 때 수 동 으로 닫 을 필요 가 없다.왜냐하면 데이터 베 이 스 는 프로그램 이 닫 힐 때 닫 히 기 때문이다.자원 을 자동 으로 방출 하려 면 다음 과 같은 방식 을 사용 할 수 있 습 니 다.
await db.close();
원본 SQL 조회 실행getDatabasesPath()를 사용 하여 데이터베이스 위 치 를 가 져 옵 니 다.
sqflite package 의 getDatabasesPath 방법 을 사용 하고 path package 의 join 방법 에 따라 데이터 베 이 스 를 정의 합 니 다.path 패키지 의 join 방법 을 사용 하 는 것 은 각 플랫폼 경로 의 정확성 을 확보 하 는 가장 좋 은 실천 입 니 다.
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');
데이터베이스 열기
Database database = await openDatabase(path, version: 1,
    onCreate: (Database db, int version) async {
  //          
  await db.execute(
      'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});
늘다트 랜 잭 션 에 표 에 몇 개의 데 이 터 를 삽입 합 니 다.
await database.transaction((txn) async {
  int id1 = await txn.rawInsert(
      'INSERT INTO Test(name, value, num) VALUES("some name", 1234, 456.789)');
  print('inserted1: $id1');
  int id2 = await txn.rawInsert(
      'INSERT INTO Test(name, value, num) VALUES(?, ?, ?)',
      ['another name', 12345678, 3.1416]);
  print('inserted2: $id2');
});
삭제 하 다.표 의 데 이 터 를 삭제 합 니 다.
count = await database
    .rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);고치다.표 의 데이터 수정
int count = await database.rawUpdate('UPDATE Test SET name = ?, value = ? WHERE name = ?',
    ['updated name', '9876', 'some name']);
print('updated: $count');
조사 하 다.조회 표 의 데이터
// Get the records
List<Map> list = await database.rawQuery('SELECT * FROM Test');
List<Map> expectedList = [
  {'name': 'updated name', 'id': 1, 'value': 9876, 'num': 456.789},
  {'name': 'another name', 'id': 2, 'value': 12345678, 'num': 3.1416}
];
print(list);
print(expectedList);
조회 표 에 저 장 된 데이터 의 총 항목 수
count = Sqflite.firstIntValue(await database.rawQuery('SELECT COUNT(*) FROM Test'));
데이터베이스 닫 기
await database.close();
데이터베이스 삭제
await deleteDatabase(path);
SQL 도 우미 사용 하기표 의 필드 및 관련 클래스 만 들 기
//  
final String tableTodo = 'todo';
final String columnId = '_id';
final String columnTitle = 'title';
final String columnDone = 'done';
//   
class Todo {
  int id;
  String title;
  bool done;
  //        Map,      
  Map<String, Object?> toMap() {
    var map = <String, Object?>{
      columnTitle: title,
      columnDone: done == true ? 1 : 0
    };
    if (id != null) {
      map[columnId] = id;
    }
    return map;
  }
  //    
  Todo();
  
  // map                  。
  Todo.fromMap(Map<String, Object?> map) {
    id = map[columnId];
    title = map[columnTitle];
    done = map[columnDone] == 1;
  }
}위의 클래스 를 사용 하여 데이터 베 이 스 를 삭제 하고 데 이 터 를 추가 삭제 하 는 검사 작업 을 진행 합 니 다.
class TodoProvider {
  Database db;
  Future open(String path) async {
    db = await openDatabase(path, version: 1,
        onCreate: (Database db, int version) async {
      await db.execute('''
  create table $tableTodo ( 
  $columnId integer primary key autoincrement, 
  $columnTitle text not null,
  $columnDone integer not null)
                        ''');
    });
  }
  //         ,        ,      。
  Future<Todo> insert(Todo todo) async {
    todo.id = await db.insert(tableTodo, todo.toMap(),conflictAlgorithm: ConflictAlgorithm.replace,);
    return todo;
  }
  Future<Todo> getTodo(int id) async {
    List<Map> maps = await db.query(tableTodo,
        columns: [columnId, columnDone, columnTitle],
        where: '$columnId = ?',
        whereArgs: [id]);
    if (maps.length > 0) {
      return Todo.fromMap(maps.first);
    }
    return null;
  }
  Future<int> delete(int id) async {
    return await db.delete(tableTodo, where: '$columnId = ?', whereArgs: [id]);
  }
  Future<int> update(Todo todo) async {
    return await db.update(tableTodo, todo.toMap(),
        where: '$columnId = ?', whereArgs: [todo.id]);
  }
  Future close() async => db.close();
}
=조회 표 의 모든 데이터
List<Map<String, Object?>> records = await db.query('my_table');
결과 의 첫 번 째 데 이 터 를 가 져 옵 니 다.
Map<String, Object?> mapRead = records.first;
위 검색 결과 목록 에서 Map 은 데이터 만 읽 는 것 으로 이 데 이 터 를 수정 하면 이상 을 던 집 니 다.
mapRead['my_column'] = 1;
// Crash... `mapRead` is read-only
맵 던 전 을 만 들 고 필드 를 수정 합 니 다.
//      map    map  
Map<String, Object?> map = Map<String, Object?>.from(mapRead);
//                 
map['my_column'] = 1;
검색 한 List
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Flutter】DateTime 전월의 일수를 취득한다달의 일수를 취득할 필요가 있어, 의외로 수요 있을까라고 생각했으므로 비망록 정도에 남겨 둡니다. DateTime 날짜에 0을 입력하면 전월 DateTime이 됩니다. 2021년 3월 0일 = 2021년 2월 28일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.