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 的变量不会关闭它,因此您的第二个示例更合适。

顺便提一句。你声明 rs 两次,所以它应该是:

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 回答