在 PDA/Windows CE 等 CDC 設備上,可運行 iAnywhere UltraLite(原 Sybase,現 SAP)這類輕量級關係數據庫,支持 JDBC 子集、SQL-92、事務、同步複制。本文記錄一次在 Windows CE 模擬器上跑通「增/查」的完整過程。
jul9.jar, jul9_zh.jar, 本地庫 jul9.dll)tutcustomer.udb、模式文件 tutcustomer.usmpackage tutorial;
import ianywhere.native_ultralite.*;
import java.sql.SQLException;
public class Customer {
static Connection conn;
public static void main(String[] args) {
try {
Customer c = new Customer();
c.insert();
c.select();
conn.close();
} catch (SQLException e) { e.printStackTrace(); }
}
public Customer() throws SQLException {
DatabaseManager dbMgr = new DatabaseManager();
// 連接參數:桌面路徑 + CE 部署路徑雙寫
String parms = "uid=DBA;pwd=sql" +
";file_name=f:\\J2ME\\tutcustomer.udb" +
";schema_file=f:\\J2ME\\tutcustomer.usm" +
";ce_file=\\UltraLite\\tutorial\\tutcustomer.udb" + // CE 設備端路徑
";ce_schema=\\UltraLite\\tutorial\\tutcustomer.usm";
try {
conn = dbMgr.openConnection(parms);
System.out.println("連接數據庫成功");
} catch (SQLException e) {
if (e.getErrorCode() == SQLCode.SQLE_ULTRALITE_DATABASE_NOT_FOUND) {
conn = dbMgr.createDatabase(parms); // 自動建庫
System.out.println("按模式創建數據庫成功");
} else throw e;
}
}
private void insert() throws SQLException {
Table t = conn.getTable("customer");
t.open();
short idCol = t.schema.getColumnID("id");
short fnCol = t.schema.getColumnID("fname");
short lnCol = t.schema.getColumnID("lname");
if (t.getRowCount() == 0) { // 避免重複插入
t.insertBegin();
t.setString(fnCol, "Li");
t.setString(lnCol, "You");
t.insert();
conn.commit();
System.out.println("插入數據成功");
} else {
System.out.println("數據已存在");
}
t.close();
}
private void select() throws SQLException {
Table t = conn.getTable("customer");
t.open();
short idCol = t.schema.getColumnID("id");
short fnCol = t.schema.getColumnID("fname");
short lnCol = t.schema.getColumnID("lname");
t.moveBeforeFirst();
while (t.moveNext()) {
System.out.println("id=" + t.getInt(idCol) +
", name=" + t.getString(fnCol) + " " + t.getString(lnCol));
}
t.close();
}
}
jul9.dll、jul9_zh.jar 複製到設備 \UltraLite\lib\。test.lnk,內容:18#"\Storage Card\Insignia Solutions JeodeRuntime\evm.exe" -Djeode.evm.console.local.keep=TRUE -Djeode.evm.console.local.paging=TRUE -Djul.library.dir=\UltraLite\lib -cp \UltraLite\tutorial;\UltraLite\lib\jul9_zh.jar Customertutcustomer.udb/.usm 放置於設備 \UltraLite\tutorial\。| 問題 | 原因 | 解決 |
|---|---|---|
桌面運行正常,CE 設備報 UnsatisfiedLinkError | 缺 jul9.dll 或路徑錯誤 | 確保 DLL 在 \UltraLite\lib\ 且 -Djul.library.dir 指向正確 |
連接報 SQLE_ULTRALITE_DATABASE_NOT_FOUND | CE 路徑與桌面路徑不同 | 連接串同時指定 file_name(桌面) 和 ce_file(設備) |
| 中文亂碼 | 未使用 jul9_zh.jar (含中文排序/字符集) | Classpath 優先載入 jul9_zh.jar |
UltraLite 為 CDC 設備帶來了真正的關係數據庫能力,JDBC 風格 API 學習成本極低。關鍵在於雙路徑連接串與本地庫部署。若目標為 CLDC 設備,請改用 RMS 或 SQLite 移植版 (如 SQLCipher for Java ME)。