質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Hive

Hiveとは、Hadoop(オープンソースの大規模分散計算フレームワーク)の上で動作するDWH(Data Warehouse:データウエアハウス)向けのプロダクトです。HiveQLというSQLのような言語で、Hadoop上のデータを操作することができます。

Q&A

0回答

1025閲覧

[Flutter]GoogleDriveより取得したHive Boxデータの復元

ky1101

総合スコア0

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Hive

Hiveとは、Hadoop(オープンソースの大規模分散計算フレームワーク)の上で動作するDWH(Data Warehouse:データウエアハウス)向けのプロダクトです。HiveQLというSQLのような言語で、Hadoop上のデータを操作することができます。

0グッド

0クリップ

投稿2021/08/04 02:05

前提・実現したいこと

[Flutter]GoogleDriveより取得したHive Boxデータの復元

発生している問題・エラーメッセージ

Flutterにてアプリを作成しております初学者です。

DBはHiveを使用しており、
データのバックアップ・復元機能を作成したいと思っております。

GoogleDrive上にアップロードしたHiveのBoxファイルをダウンロードし、再度Boxをオープンしたのですが、
データが読み込まれませんでした。
なお、Open時にエラー等は出ておりません。

お聞きしたいソースの該当部分は「drive.files.get」以降の処理になります。
現状、Google Drive APIからDLしたファイルデータをwriteAsBytesにて書き込んでおりますが、
その他にファイルデータに対する処理が必要なのでしょうか、、

該当のソースコード

dart

1//アップロード 2 _uploadFileToGoogleDrive() async { 3 //別の操作を防止するため、ローディング画面を表示 4 showGeneralDialog( 5 context: context, 6 barrierDismissible: false, 7 transitionDuration: Duration(seconds: 2), 8 barrierColor: Colors.black.withOpacity(0.5), 9 pageBuilder: (BuildContext context, Animation animation, 10 Animation secondaryAnimation) { 11 return Center( 12 child: CircularProgressIndicator(), 13 ); 14 }); 15 var client = 16 GoogleHttpClient(await googleSignInAccount!.authHeaders); //承認情報を取得 17 var drive = ga.DriveApi(client); //APIヘアクセス 18 drive.files.list(spaces: 'appDataFolder'); 19 ga.File fileToUpload = ga.File(); //ドライブ用のファイルのインスタンスを作成 20 await _listGoogleDriveFiles().whenComplete(() {}); //Googleドライブのリストを取得 21 22 //全ての既存ファイルの事前削除を実施 23 if (list != null && list!.files != null) { 24 var files = list!.files!; 25 for (var i = 0; i < files.length; i++) { 26 if (files[i].id != null) { 27 String id = files[i].id!; 28 await drive.files.delete(id); 29 } 30 } 31 } 32 33 var boxPathList = Boxes.getBoxPathList(); //BOXファイルのパスを取得 34 35 //ファイルのアップロード処理 36 boxPathList.forEach((path) async { 37 var file = File(path); //ファイルをセット 38 fileToUpload.name = Common.getBasename(path); //ファイルの名前をセット 39 fileToUpload.modifiedTime = DateTime.now().toUtc(); //アップロードの日付 40 fileToUpload.parents = ["appDataFolder"]; //アプリ専用フォルダを指定 41 var response; 42 response = drive.files.create( 43 fileToUpload, 44 uploadMedia: ga.Media(file.openRead(), file.lengthSync()), 45 ); 46 }); 47 48 await _listGoogleDriveFiles(); //リストの再取得 49 _logoutFromGoogle().whenComplete(() => Navigator.pop(context)); 50 } 51 52 53 54 55 56 57//ダウンロード 58 Future<void> _downloadGoogleDriveFile() async { 59  //復元前に現在のデータを消去 60 var folderItem = Boxes.getFolderItem(); 61 await folderItem.clear(); 62 63 //別の操作を防止するため、ローディング画面を表示 64 showGeneralDialog( 65 context: context, 66 barrierDismissible: false, 67 transitionDuration: Duration(seconds: 1), 68 barrierColor: Colors.black.withOpacity(0.5), 69 pageBuilder: (BuildContext context, Animation animation, 70 Animation secondaryAnimation) { 71 return Center( 72 child: CircularProgressIndicator(), 73 ); 74 }); 75 await _listGoogleDriveFiles(); //リストの再取得 76 var client = GoogleHttpClient(await googleSignInAccount!.authHeaders); 77 var drive = ga.DriveApi(client); 78 var boxPathList = Boxes.getBoxPathList(); //BOXファイルのパスを取得 79 if (list != null && list!.files != null && list!.files!.length > 0) { 80 var files = list!.files!; 81 for (var path in boxPathList) { 82 var boxName = Common.getBasename(path); //Boxの名前をセット 83 for (var i = 0; i < boxPathList.length; i++) { 84 if (files[i].name == boxName) { 85 String id = files[i].id!; 86 ga.Media backUpData = await drive.files.get(id, 87 downloadOptions: ga.DownloadOptions.fullMedia) as ga.Media; 88 89 List<int> dataStore = []; 90 backUpData.stream.listen((data) { 91 dataStore.insertAll(dataStore.length, data); 92 }, onDone: () async { 93 Boxes.closeBoxByName(boxName); 94 Directory tempDir = 95 await getTemporaryDirectory(); //Get temp folder using Path Provider 96 String tempPath = tempDir.path; //Get path to that location 97 File backUpFile = 98 File('$tempPath/$boxName'); //Create a dummy file 99 await backUpFile.writeAsBytes(dataStore); 100 await backUpFile.copy(path); 101 await backUpFile.delete(); 102 Boxes.openBoxByName(boxName); 103       //データが読み込まれたかの確認 104 var folderItems = Boxes.getFolderItem(); 105 print(folderItems.length); //データ0件になる 106       //バックアップをダウンロードして、保存が成功した場合の処理 107 }, onError: (error) { 108 //エラー処理 109 }); 110 } 111 } 112 } 113 } 114 await _listGoogleDriveFiles(); //リストの再取得 115 await _logoutFromGoogle().whenComplete(() => Navigator.pop(context)); 116 }

試したこと

Boxファイルのlengthが以下で差異が無いことを確認しております。

アップロード前のローカルBoxファイル
アップロードしたGoogle Drive上のファイル
ダウンロードしたBoxファイル
ダウンロードしたBoxファイルをコピーした、ローカルBoxファイル

補足情報(FW/ツールのバージョンなど)

参考にしたページ:
https://qiita.com/YuKiO-OO/items/67b471e6be6c4c4c26e9
https://github.com/hivedb/hive/issues/629

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問