1

新しい結果セットを作成する前に、Titanium Mobile で結果セットを閉じる必要がありますか?それとも、参照がなくなると自動的に「閉じられる」のでしょうか?

たとえば、このようなものは安全でメモリ リークがないのでしょうか?

var db = db.open("db_name");
var rs = db.execute("SELECT * FROM table");

while(rs.isValidRow()){ /* working with the resuls... */ }

// I make another select before closing the previous (current) results set
rs = db.execute("SELECT * FROM another_table");

while(rs.isValidRow()){ /* working with the results... */ }

// Once I am completely done I close the RS and DB
rs.close();
db.close();

または、新しい選択が必要になるたびに結果セットを閉じる必要があります。

var db = db.open("db_name");
var rs = db.execute("SELECT * FROM table");

while(rs.isValidRow()){ /* working with the resuls... */ }

// Close RS and then initialize a new one
rs.close();
rs = db.execute("SELECT * FROM another_table");

while(rs.isValidRow()){ /* working with the resuls... */ }

rs.close();
db.close();
4

2 に答える 2

2

常に必要なデータをすべて取得したら、すぐに ResultSet を閉じる必要があります。ResultSet を指す変数を上書きしても閉じないため、2 番目の例の方が適切です。

ところで。rs を 2 回宣言しているので、次のようにする必要があります。

var db = db.open("...");
var rs = db.execute("SELECT * FROM table");

// while(rs.isValidRow()){ ... }

rs.close();

rs = db.execute("SELECT * FROM another_table"); // Another select

// while(rs.isValidRow()){ ... }


rs.close();
db.close();

または、コードで何が起こっているのかを混乱させないようにすることをお勧めします。

var db = db.open("...");
var rs1 = db.execute("SELECT * FROM table");
var rs2 = db.execute("SELECT * FROM another_table");

// while(rs1.isValidRow()){ ... }

rs1.close();

// while(rs2.isValidRow()){ ... }

rs2.close();

db.close();

編集: SQLite のベスト プラクティスを読んで、データベースで操作を作成、実行、閉じる方法の詳細を確認してください。

于 2013-10-13T03:49:03.627 に答える
0

ドキュメントhttp://docs.appcelerator.com/platform/latest/#!/api/Titanium.Database.ResultSetによると

iOS プラットフォームでは、データベースを閉じると結果セットも閉じられます。つまり、データベースが現在開いている場合にのみ結果セットにアクセスできます。

これは、Titanium Mobile (iOS) のソース コードにもありますiphone/Classes/TiDatabaseProxy.m( Github を参照) 。

ソース コード (同じファイル) を見るとTiDatabaseProxy、結果セットを格納するために使用され、後でそれらすべてを閉じるために使用される配列が作成されることがわかります。( Github を参照)

ただし、Android は動作が異なるように見えますが、プラットフォームは他にもいくつかあります。そのため (また、コードを「最もクリーン」にするために)、結果セットを閉じてから、他のケースのリソース (異なるプラットフォーム上) で新しいものを初期化することをお勧めします。解放されず、メモリ リークが発生する可能性があります。

于 2016-08-21T03:18:37.203 に答える