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에 따라 라이센스가 부여됩니다.