storage

Luaの動作は端末再起動によりリセットされますが、storageを利用することで内部のフラッシュメモリにデータを保存しておき後で読み出すことが可能となります。

storageには2種類あります。

種類 特徴
kvs シンプルなobjectを保存する1つだけのストレージ
file ファイル名を指定してより大規模なファイルを保存するストレージ

ファイル容量

1MByte程度の容量の中でLuaスクリプトと同じく保存されることになります。
保存可能な容量はとても小さいです。

kvsは簡単に利用できる一方で、一度すべてのデータをメモリに展開するため数kbyte程度の容量に抑える必要があります。

fileはより大きな容量を扱うことができますが、部分アクセスなど複雑なプログラムが必要です。より大きな容量を扱うことができますが、それでも100kbyte程度に抑えることが推奨されます。

読み書き回数

フラッシュメモリへの書き込みはフラッシュの寿命を短くします。

可能な限り最小限のアクセスとなるような設計が必要です。

storage.kvsSave()

storage.kvsSave()によりobjectを保存することができます。エラーとなった場合には返り値が戻ります。

obj = {
  a=1,
  b="hello",
  bool=true,
  c={ x=10, y=20, z={ foo="bar" } }
}

result = storage.kvsSave(obj)

storage.kvsLoad()

存在するkvsを読み取るにはstorage.kvsLoad()を利用します。

data = storage.kvsLoad();

File書き込み

ファイルは存在していても、これから作るものでもファイル名を指定して一度開く必要があります、storage.fileOpen(filename)として指定します。

開いたファイルに対して書き込みを行う場合は以下の関数を利用します。

このfileWrite()関数は上書きの関数となります。どんなに大きなデータがあっても削除され、このデータに置き換わります。

storage.fileWrite("ABC");

今あるデータに追記する場合にはstorage.fileAppend(data);を利用します。

storage.fileAppend("appended");

最後にstorage.fileClose()を呼び出すことで閉じることができ完了となります。

storage.fileClose();

File読み取り

Fileの読み取りも同じくfileOpen() fileClose()を利用します。

ファイルサイズをバイト数で取得することで大きさがわかります。

storage.fileGetSize();

実際のデータ雨読み取りは以下のようにオフセットと長さを指定して読み取ります。長さは1024バイト以下としてください。

data = storage.fileRead(0, length);

Example


-- open
storage.fileOpen("text.txt")

-- Write
storage.fileWrite("ABC");
length = storage.fileGetSize();
os.log("File size: " .. length);
data = storage.fileRead(0, length);
os.log(data);

-- Append
storage.fileAppend("abcdefg");
storage.fileAppend("HIJKLKLMN");
length = storage.fileGetSize();
os.log("File size: " .. length);
data = storage.fileRead(0, length);
os.log(data);

-- Ranged Read
data = storage.fileRead(3, 7);
os.log(data);

-- Overwrite
storage.fileWrite("ZYZ");
length = storage.fileGetSize();
os.log("File size: " .. length);
data = storage.fileRead(0, length);
os.log(data);

-- close
storage.fileClose();