BlackBerry操作sqlite的API封裝
BlackBerry操作sqlite的API封裝
BlackBerry提供了對SQLite的API,但是直接拿來使用還是比較麻煩的,這里自己寫了一個小的API封裝。
1. 核心工具類DBUtil,提供對數據庫表的操作。
package db;
import java.util.Vector;
import net.rim.device.api.database.Cursor;
import net.rim.device.api.database.Database;
import net.rim.device.api.database.DatabaseException;
import net.rim.device.api.database.DatabaseFactory;
import net.rim.device.api.database.DatabaseIOException;
import net.rim.device.api.database.Row;
import net.rim.device.api.database.Statement;
import net.rim.device.api.io.URI;
public class DBUtil {
public static DBUtil util = new DBUtil();
private DBUtil() {
}
public static DBUtil getInstance() {
return util;
}
public Vector query(String sql, RowMapper rowMapper) throws DBException {
return this.query(sql, new Object[0], rowMapper);
}
public Vector query(String sql, Object[] params, RowMapper rowMapper) throws DBException {
Vector list = new Vector();
Database db = this.getDatabase();
Statement stmt = null;
Cursor cursor = null;
try {
stmt = db.createStatement(sql);
stmt.prepare();
for (int i = 0; i < params.length; i++) {
stmt.bind(i + 1, params[i].toString());
}
cursor = stmt.getCursor();
while (cursor.next()) {
Row row = cursor.getRow();
list.addElement(rowMapper.mapRow(row));
}
stmt.execute();
} catch (Exception ex) {
throw new DBException(ex.getMessage());
} finally {
this.close(cursor);
this.close(stmt);
this.close(db);
}
return list;
}
public Vector query(String sql, ParameterBinder binder, RowMapper rowMapper) throws DBException {
Vector list = new Vector();
Database db = this.getDatabase();
Statement stmt = null;
Cursor cursor = null;
try {
stmt = db.createStatement(sql);
stmt.prepare();
binder.bind(stmt);
cursor = stmt.getCursor();
while (cursor.next()) {
Row row = cursor.getRow();
list.addElement(rowMapper.mapRow(row));
}
stmt.execute();
} catch (Exception ex) {
throw new DBException(ex.getMessage());
} finally {
this.close(cursor);
this.close(stmt);
this.close(db);
}
return list;
}
public void update(String sql) throws DBException {
this.update(sql, new Object[0]);
}
public void update(String sql, Object[] params) throws DBException {
Database db = this.getDatabase();
Statement stmt = null;
try {
db.beginTransaction();
stmt = db.createStatement(sql);
stmt.prepare();
for (int i = 0; i < params.length; i++) {
stmt.bind(i + 1, params[i].toString());
}
stmt.execute();
db.commitTransaction();
} catch (Exception ex) {
throw new DBException(ex.getMessage());
} finally {
this.close(stmt);
this.close(db);
}
}
public void update(String sql, ParameterBinder binder) throws DBException {
Database db = this.getDatabase();
Statement stmt = null;
try {
db.beginTransaction();
stmt = db.createStatement(sql);
stmt.prepare();
binder.bind(stmt);
stmt.execute();
db.commitTransaction();
} catch (Exception ex) {
throw new DBException(ex.getMessage());
} finally {
this.close(stmt);
this.close(db);
}
}
private Database getDatabase() throws DBException {
try {
URI myURI = URI.create("file:///SDCard/Databases/test.db");
Database db = DatabaseFactory.openOrCreate(myURI);
return db;
} catch (Exception ex) {
throw new DBException(ex.getMessage());
}
}
private void close(Database db) {
try {
if (db != null) {
db.close();
}
} catch (DatabaseIOException ex) {
ex.printStackTrace();
}
}
private void close(Statement stmt) {
try {
if (stmt != null) {
stmt.close();
}
} catch (DatabaseException ex) {
ex.printStackTrace();
}
}
private void close(Cursor cursor) {
try {
if (cursor != null) {
cursor.close();
}
} catch (DatabaseException ex) {
ex.printStackTrace();
}
}
}2. 數據庫操作異常類DBException,這里由于BB的一下限制,所以個人感覺DBException繼承RuntimeException類更好一點,而不是Exception類。
package db;
public class DBException extends RuntimeException {
private static final long serialVersionUID = 1L;
public DBException() {
super();
}
public DBException(String message) {
super(message);
}
}3. ParameterBinder接口,用來做參數化執行sql語句是傳遞參數使用。
package db;
import net.rim.device.api.database.Statement;
public interface ParameterBinder {
void bind(Statement stmt) throws Exception;
}4. RowMapper接口,用來提供對于每一行記錄的轉換。
package db;
import net.rim.device.api.database.Row;
public interface RowMapper {
Object mapRow(Row row) throws Exception;
}5. Test類
package db;
import net.rim.device.api.database.Row;
import net.rim.device.api.database.Statement;
public class Test {
public static void test() throws Exception {
DBUtil.getInstance().update("CREATE TABLE IF NOT EXISTS test ('id' Long,'col1' Text, 'col2' Text, 'col3' Text)");
DBUtil.getInstance().update("insert into test(id, col1, col2, col3) values(?, ?, ?, ?)", new Object[]{Long.toString(System.currentTimeMillis()), "a", "b", "c"});
DBUtil.getInstance().update("insert into test(id, col1, col2, col3) values(?, ?, ?, ?)", new ParameterBinder() {
public void bind(Statement stmt) throws Exception {
stmt.bind(1, 1);
stmt.bind(2, "111");
stmt.bind(3, "222");
stmt.bind(4, "333");
}
});
DBUtil.getInstance().query("select * from test", new RowMapper() {
public Object mapRow(Row row) throws Exception {
System.out.println(row.getObject(0));
return row.getObject(0);
}
});
DBUtil.getInstance().query("select * from test where id=?",
new ParameterBinder() {
public void bind(Statement stmt) throws Exception {
stmt.bind(1, 1);
}
},
new RowMapper() {
public Object mapRow(Row row) throws Exception {
System.out.println(row.getObject(0));
return row.getObject(0);
}
});
}
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!