Lovefield 的資料匯出與匯入

title: how-to-import-and-export-data-in-lovefield
tags: angular 2


會使用到lovefield來開發程式,應該蠻有機會有需要用到匯出(export)與匯入(import)這兩個功能的,今天來介紹一下。

export

lovefield內建的lf.Database物件就提供了匯出與匯入這兩個功能,首先介紹匯出的部分。export會將程式內的資料庫轉為一個javascript的object。格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name": <資料庫名稱>,
"version": <資料庫版本>,
"tables": {
<資料表名稱>: [
{
<欄位1>: <欄位內容>,
<欄位2>: <欄位內容>,
...
},
{ ... },
...
],
<資料表名稱>: [ ... ],
...
}
}

使用方式

在自己寫的servicelf.service.ts中加入一個新的function

1
2
3
4
exportDB() {
var exportedDb = this.myDb.export();
return exportedDb;
}

同場加映:如何將匯出的資料存成檔案?

我們要利用網址來將資料存為檔案,首先需要先import DomSanitizationService這個功能。
再來需要將href,file_name這兩個屬性做bind,所以先宣告,
最後寫一個function來call上面所寫好的service的export function。當使用者點選匯出資料庫之後,再點選下載連結就可以將資料庫存為檔案。
匯出資料庫示範圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
import { DomSanitizationService } from '@angular/platform-browser';
import { LFService } from './lf.service';

export class SettingComponent implements OnInit {
href: any;
download_text: string = "請先點選『匯出資料庫』";
file_name: string;
import_data: string;

constructor(private _lfService: LFService, private _sanitizer: DomSanitizationService) {

}
exportDb() {
this._lfService.exportDB().then((result: any) => {
// console.log(result);
var url = 'data:text/json;charset=utf8,' + encodeURIComponent(JSON.stringify(result));
this.href = this._sanitizer.bypassSecurityTrustUrl(url);
this.download_text = "按右鍵『另存連結為...』";
this.file_name = "my_db_backup";

});
}

該頁面的html

1
2
<button type="button" (click)="exportDb()" pButton label="匯出資料庫"></button>
<a [href]="href" [download]="file_name" target="_blank">下載</a><span> ({{download_text}})</span>

import

import部分需要先將原本資料庫的內容全部清空後(不是把整個資料庫砍掉),才可以進行匯入的動作。注意,匯入的資料的資料庫名稱與版本必須與原本的一致。

1
2
3
4
5
6
7
{
"name": <資料庫名稱>,
"version": <資料庫版本>,
"tables": {
...
}
}

匯入的不可以是字串string,必須是json的物件,所以要利用JSON.parse(data)來轉換(假設你的data原本是string)。

1
2
3
4
5
this.myDb.delete().from(this.myTable).exec().then(() => {
return this.myDb.import(JSON.parse(data)).then(function () {
alert("成功匯入資料");
});
});

同場加映:如何匯入date_time類別的資料?

有一點需要注意,那就是如果資料表的欄位有時間日期lf.Type.DATE_TIME的類別,則需要先行處理,不然會產生value.getTime()的error。本例參考stackoverflow改寫了一個dateTimeReviver,來處理yyyy-MM-ddTHH:ii:ss.fffZ的格式(ex: 2016-07-27T15:42:22.554Z)。把這個Reviver當做JSON.parse()的第二個參數即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
importDb(data: string) {

var dateTimeReviver = function (key: any, value: any) {
var a: any;
if (typeof value === 'string') {
a = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(.\d{3}Z)/.exec(value);
if (a) {
return new Date(value);
}
}
return value;
}
this.myDb.delete().from(this.myTable).exec().then(() => {
return this.myDb.import(JSON.parse(data, dateTimeReviver)).then(function () {
alert("成功匯入資料");
});
});
}