前一篇中提到,sqflite_common_ffi與getDatabase()
函式一起使用時不太穩定,可能會有一些bug,建議改使用如path_provider
的其他檔案開啟方式。那麼,今天筆者就來介紹一下這是什麼吧!
path_provider是用來尋找文件位置的一個package,package中的函式將會回傳一個類別為Directory
的物件,而我們後續可在利用該物件來開啟與編寫指定檔案,與獲得資料夾的位置。因為應用程式可能會在不同的裝置與作業系統上運作,文件位置也會隨之改變,使得這個package有著使用上的重要性。不過有一點需要注意,並非所有函式都有支援每個作業系統。
以下為開啟的資料夾一覽:
Directory | Android | iOS | Linux | macOS | Windows |
---|---|---|---|---|---|
Temporary | V | V | V | V | V |
Downloads | V | V | V | V | V |
Application Support | V | V | V | V | V |
Application Library | X |
V | X |
V | X |
Application Documents | V | V | V | V | V |
Application Cache | V | V | V | V | V |
External Storage | V | X |
X |
X |
X |
External Cache Directories | V | X |
X |
X |
X |
External Storage Directories | V | X |
X |
X |
X |
至於函式名稱,便是get[Directory]Directory()
,中括弧使用欲開啟的資料夾做替換的動作。
來看一下範例會更清楚:
// example 1
Directory tempDir = await getTemporaryDirectory();
// example 2
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
// example 3
Future<String> _getlocalPath() async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
一定要記得使用await
哦!否則程式很可能會在開啟檔案前便直接執行下一行,造成檔案未被成功開啟。
在這個應用程式中,只需要修改data/models/blocks.dart中的BlocksDb.open()
便可以了。程式碼如下:
abstract class BlocksDb {
String dbFilename, tableName, executeSQL;
bool dbIsOpen = false;
late var db;
BlocksDb(
{required this.dbFilename,
required this.tableName,
required this.executeSQL});
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
Future open() async {
db = await openDatabase(
join(await _localPath, dbFilename),
//dbFilename,
version: 1,
onOpen: (db) {
dbIsOpen = true;
},
onCreate: (db, version) async {
await db.execute('''CREATE TABLE $tableName ($executeSQL)''');
},
);
return null;
}
...
}
程式中,新增了get _localPath
,來獲取裝置中Documents資料夾的位置,並將它替代openDatabase()
中的getDatabase()
便能夠成功開啟檔案位置了。
當應用程式執行時,使用該應用程式新增新項目後,能夠看到測試裝置中多了一個名為timeBlock.db的檔案,並且其中的內容確實是剛剛所新增的。
謝謝願意閱讀到這裡的讀者!程式碼仍然會一併更新到github: nnyjan02426/Schedrag中。
有任何想說的都歡迎留言或email!
email: nnyjan02426@gmail.com