Flutter 本地存儲

Flutter支持Preferences(Shared Preferences and NSUserDefaults) 厢洞、文件、和Sqlite3丧叽。若想使用這個功能需要引入官方倉庫的相應插件公你,下面詳細介紹這三種存儲方式的使用方法。

Preferences

等同iOS的NSUserDefaults和Android的SharedPreferences迂尝。

導入插件
  1. 打開項目的pubspec.yaml配置剪芥,在dependencies節(jié)點下新增配置:
    shared_preferences: ^0.4.1
  2. 點擊開發(fā)工具提示的packages get按鈕或者在命令行輸入flutter packages get來同步第三方插件
  3. 在Dart文件中引入插件
    import 'package:shared_preferences/shared_preferences.dart';

Flutter支持的全部插件: https://github.com/flutter/plugins

使用示例
setUserName() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString(mUserName,"小明");
}

getUserName() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    userName = prefs.getString(mUserName);
}

displayUserName() {
    Future<String> userName = getUserName();
    userName.then((String userName) {
           Scaffold.of(context).showSnackBar(
                    SnackBar(content: Text("數據獲取成功:$userName")));
    });
}

文件存儲

導入插件
  1. 打開項目的pubspec.yaml配置粗俱,在dependencies節(jié)點下新增配置:
    path_provider: ^0.4.0
  2. 點擊開發(fā)工具提示的packages get按鈕或者在命令行輸入flutter packages get來同步第三方插件
  3. 在Dart文件中引入插件
    import 'package:path_provider/path_provider.dart';
使用示例

獲取文件路徑方法:

  1. 獲取應用緩存目錄: getTemporaryDirectory
    • 類似iOS的NSTemporaryDirectory和Android的getCacheDir
  2. 獲取應用文件目錄: getApplicationDocumentsDirectory
    • 類似iOS的NSDocumentDirectory和Android上的AppData目錄
    • 應用程序被刪除時,系統會清除目錄
  3. 存儲卡: getExternalStorageDirectory
    • 僅支持Android平臺
?// 找到正確的本地路徑
Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

// 創(chuàng)建對文件位置的引用
Future<File> get _localFile async {
  final path = await _localPath;
  return new File('$path/counter.txt');
}

// 將數據寫入文件
Future<File> writeCounter(int counter) async {
  final file = await _localFile;
  // Write the file
  return file.writeAsString('$counter');
}

// 從文件中讀取數據
Future<int> readCounter() async {
  try {
    final file = await _localFile;
    // Read the file
    String contents = await file.readAsString();

    return int.parse(contents);
  } catch (e) {
    // If we encounter an error, return 0
    return 0;
  }
}

Sqfite

SQLite plugin for Flutter. Get the default databases location. On Android, it is typically data/data/<package_name>/databases, On iOS, it is the Documents directory.

導入插件
  1. 打開項目的pubspec.yaml配置,在dependencies節(jié)點下新增配置:
    sqflite: ^1.0.0
  2. 點擊開發(fā)工具提示的packages get按鈕或者在命令行輸入flutter packages get來同步第三方插件
  3. 在Dart文件中引入插件
    import 'package:sqflite/sqflite.dart';

使用示例

// 獲取數據庫文件的存儲路徑
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');

// 創(chuàng)建數據庫表
db = await openDatabase(path, version: 1,
       onCreate: (Database db, int version) async {
   await db.execute('''
        CREATE TABLE $tableBook (
            $columnId INTEGER PRIMARY KEY, 
            $columnName TEXT, 
            $columnAuthor TEXT, 
            $columnPrice REAL, 
            $columnPublishingHouse TEXT)
          ''');
    });

// 插入數據
Future<int> rawInsert(String sql, [List<dynamic> arguments]);

Future<int> insert(String table, Map<String, dynamic> values,
      {String nullColumnHack, ConflictAlgorithm conflictAlgorithm});


// 查詢數據
Future<List<Map<String, dynamic>>> rawQuery(String sql,
      [List<dynamic> arguments]);

Future<List<Map<String, dynamic>>> query(String table,
      {bool distinct,
      List<String> columns,
      String where,
      List<dynamic> whereArgs,
      String groupBy,
      String having,
      String orderBy,
      int limit,
      int offset});

// 更新數據
Future<int> rawUpdate(String sql, [List<dynamic> arguments]);

Future<int> update(String table, Map<String, dynamic> values,
      {String where,
      List<dynamic> whereArgs,
      ConflictAlgorithm conflictAlgorithm});

// 刪除
Future<int> rawDelete(String sql, [List<dynamic> arguments]);

Future<int> delete(String table, {String where, List<dynamic> whereArgs});

// 關閉數據庫
Future close() async => db.close();

參考文檔

Flutter中的本地存儲
Flutter數據存儲之shared_preferences
Flutter 構建完整應用手冊-持久化
Flutter持久化存儲之數據庫存儲

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市神汹,隨后出現的幾起案子古今,更是在濱河造成了極大的恐慌,老刑警劉巖氓拼,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異坏匪,居然都是意外死亡撬统,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門凭迹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來几于,“玉大人,你說我怎么就攤上這事朽砰『砹酰” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵造锅,是天一觀的道長。 經常有香客問我糙箍,道長牵祟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任咕晋,我火速辦了婚禮收奔,結果婚禮上坪哄,老公的妹妹穿的比我還像新娘呢撞。我一直安慰自己饰剥,他們只是感情好摧阅,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顾孽,像睡著了一般比规。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上测秸,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天灾常,我揣著相機與錄音,去河邊找鬼沈撞。 笑死雕什,一個胖子當著我的面吹牛,可吹牛的內容都是我干的壹士。 我是一名探鬼主播凰盔,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼户敬!你這毒婦竟也來了?” 一聲冷哼從身側響起忠怖,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抄瑟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鞋拟,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡航闺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年潦刃,在試婚紗的時候發(fā)現自己被綠了懈叹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡胧洒,死狀恐怖环揽,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情汛兜,我是刑警寧澤通今,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站漏策,受9級特大地震影響臼氨,放射性物質發(fā)生泄漏。R本人自食惡果不足惜储矩,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一持隧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屡拨,春花似錦褥实、人聲如沸裂允。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哩俭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砸捏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工隙赁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垦藏,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓伞访,卻偏偏與公主長得像掂骏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厚掷,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容