Flutter 데이터베이스 사용 방법

설명 하 다.
Flutter 원생 은 데이터 베 이 스 를 지원 하지 않 습 니 다.SQLlit 플러그 인 을 사용 하여 데이터 베 이 스 를 사용 하 는 능력 을 가지 게 합 니 다.사실은 Flutter 가 플러그 인 을 통 해 네 이 티 브 시스템 과 소통 하여 데이터 베 이 스 를 조작 하 는 것 입 니 다.
플랫폼 지원
  • FLutter 의 SQLite 플러그 인 은 IOS,안 드 로 이 드,MacOS 플랫폼
  • 을 지원 합 니 다.
  • 리 눅 스/Windows/DartVM 을 지원 하려 면 sqflite 를 사용 하 십시오.common_ffi
  • 은 웹 플랫폼
  • 을 지원 하지 않 습 니 다.
  • 데이터 베 이 스 는 안 드 로 이 드 나 ios 배경 에서
  • 을 실행 합 니 다.
    사용 사례
    notepad_sqflite iOS/Android/Windows/linux/Mac 에서 실행 할 수 있 는 간단 한 메모 장 응용 프로그램
    간단히 사용 하 다
    의존 도 를 높이다
    SQLite 데이터 베 이 스 를 사용 하기 위해 서 는 먼저 sqflite 와 path 두 패 키 지 를 가 져 와 야 합 니 다.
  • sqflite 는 SQLite 데이터 베 이 스 를 편리 하 게 사용 할 수 있 도록 다양한 유형 과 방법 을 제공 합 니 다.
  • 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형식의 데 이 터 를 List형식 으로 변환 하면 우 리 는 시원 하 게 사용 할 수 있 습 니 다.
    
    // Convert the List<Map<String, dynamic> into a List<Todo>.
      return List.generate(maps.length, (i) {
        return Todo(
          id: maps[i][columnId],
          title: maps[i][columnTitle],
          done: maps[i][columnDown],
        );
      });
    
    
    일괄 처리
    dart 와 원생 간 의 빈번 한 상호작용 을 피하 기 위해 일괄 처 리 를 사용 할 수 있 습 니 다.
    
    batch = db.batch();
    batch.insert('Test', {'name': 'item'});
    batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
    batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
    results = await batch.commit();
    
    
    모든 작업 의 결 과 를 가 져 오 는 데 비용 이 필요 합 니 다.(삽 입 된 Id 와 업데이트,삭 제 된 변경 수)작업 결과 에 관심 이 없다 면 다음 작업 종료 결과 에 대한 응답 을 수행 할 수 있 습 니 다.
    
    await batch.commit(noResult: true);
    
    트 랜 잭 션 에서 일괄 처리 사용
    트 랜 잭 션 에서 일괄 처리 작업 을 하고 트 랜 잭 션 을 제출 한 후에 야 일괄 처 리 를 제출 합 니 다.
    
    await database.transaction((txn) async {
      var batch = txn.batch();
      
      // ...
      
      // commit but the actual commit will happen when the transaction is committed
      // however the data is available in this transaction
      await batch.commit();
      
      //  ...
    });
    
    일괄 처리 이상 무시
    기본 적 인 상황 에서 일괄 처리 중 오류 가 발생 하면 중단 합 니 다(실행 되 지 않 은 문 구 는 실행 되 지 않 습 니 다).후속 작업 이 계속 실 행 될 수 있 도록 오 류 를 무시 할 수 있 습 니 다.
    
    await batch.commit(continueOnError: true);
    
    표 이름과 열 에 대하 여
    일반적으로 우 리 는 SQLite 키 워드 를 사용 하여 표 이름과 열 이름 을 명명 하 는 것 을 피해 야 한다.예:
    "add","all","alter","and","as","autoincrement","between","case","check","collate",
    "commit","constraint","create","default","deferrable","delete","distinct","drop",
    "else","escape","except","exists","foreign","from","group","having","if","in","index",
    "insert","intersect","into","is","isnull","join","limit","not","notnull","null","on",
    "or","order","primary","references","select","set","table","then","to","transaction",
    "union","unique","update","using","values","when","where"
    지원 하 는 저장 소 종류
  • 은 값 에 대해 유효성 검 사 를 하지 않 았 기 때문에 지원 되 지 않 는 유형 을 사용 하지 마 십시오.참조:
  • 은 DateTime 형식 을 지원 하지 않 습 니 다.int 또는 String
  • 으로 저장 할 수 있 습 니 다.
  • 은 bool 형식 을 지원 하지 않 으 며 int 형식 0:false,1:true
  • 으로 저장 할 수 있 습 니 다.
    SQLite 형식
    dart 형식
    값 범위
    integer
    int
    부터-2^63~2^63-1
    real
    num
    text
    String
    blob
    Uint8List
    레 퍼 런 스
    sqflile 공식 주소
    flutter 는 SQLite 를 사용 하여 데이터 저장 공식 소개 문 서 를 저장 합 니 다.
    여기 서 Flutter 데이터베이스 사용 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Flutter 데이터베이스 사용 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다! 

    좋은 웹페이지 즐겨찾기