Собственный интерфейс к SQLite в плагине Cordova/PhoneGap для Android/iOS/WP(8), с HTML5 Web SQL API.
Лицензия для версий Android и WP(8): MIT или Apache 2.0.
Лицензия для версии iOS: только MIT.
Автоматическое расширение файла базы данных «.db» теперь удалено для версии Android, для соответствия другим версиям. Для существующего приложения вам, возможно, придётся открыть существующую базу данных следующим образом:
var db = window.sqlitePlugin.openDatabase({name: "my.db"});
Также модель потоков изменена, как описано ниже.
window.openDatabase()
--> sqlitePlugin.openDatabase()
.Идея состоит в том, чтобы максимально точно эмулировать HTML5 SQL API. Единственное существенное изменение заключается в использовании window.sqlitePlugin.openDatabase() (или sqlitePlugin.openDatabase()) вместо window.openDatabase(). Если вы видите какое-либо другое существенное изменение, пожалуйста, сообщите об этом, возможно, это ошибка.
Открытие базы данных
Есть два варианта открытия базы данных:
var db = window.sqlitePlugin.openDatabase({name: "my.db"});
var db = window.sqlitePlugin.openDatabase("myDatabase.db", "1.0", "Demo", -1);
ВАЖНО: дождитесь события «deviceready», как в следующем примере:
// Wait for Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);
// Cordova is ready
function onDeviceReady() {
var db = window.sqlitePlugin.openDatabase({name: "my.db"});
// ...
}
Примечание: имя файла базы данных должно включать расширение, если это необходимо.
Фоновая обработка
Модель потоков зависит от используемой версии:
Пример с функцией PRAGMA
Это довольно серьёзное испытание: сначала мы создаём таблицу и добавляем одну запись, затем запрашиваем количество, чтобы проверить, была ли вставлена запись так, как ожидалось. Обратите внимание, что в середине первого обратного вызова создаётся новая транзакция.
// Wait for Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);
// Cordova is готов
function onDeviceReady() {
var db = window.sqlitePlugin.openDatabase({name: "my.db"});
db.transaction(function(tx) {
tx.executeSql('DROP TABLE IF EXISTS test_table');
tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text, data_num integer)');
// демонстрация PRAGMA:
db.executeSql("pragma table_info (test_table);", [], function(res) {
console.log("PRAGMA res: " + JSON.stringify(res));
});
tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)", ["test", 100], function(tx, res) {
console.log("insertId: " + res.insertId + " -- вероятно 1");
console.log("rowsAffected: " + res.rowsAffected + " -- должно быть 1");
db.transaction(function(tx) {
tx.executeSql("select count(id) as cnt from test_table;", [], function(tx, res) {
console.log("res.rows.length: " + res.rows.length + " -- должно быть 1");
console.log("res.rows.item(0).cnt: " + res.rows.item(0).cnt + " -- должно быть 1");
});
});
}, function(e) {
console.log("ERROR: " + e.message);
});
});
}
Пример с вложенными транзакциями на уровне транзакции
В этом случае одна и та же транзакция в первом обратном вызове executeSql() повторно используется для запуска executeSql().
// Wait for Cordova to load
document.addEventListener("deviceready", onDeviceReady, false);
// Cordova готов
function onDeviceReady() {
var db = window.sqlitePlugin.openDatabase("Database", "1.0", "Demo", -1);
db.transaction(function(tx) {
tx.executeSql('DROP TABLE IF EXISTS test_table');
tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text, data_num integer)');
tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)", ["test", 100], function(tx, res) {
console.log("insertId: " + res.insertId + " -- вероятно 1");
console.log("rowsAffected: " + res.rowsAffected + " -- должно быть 1");
tx.executeSql("select count(id) as cnt from test_table;", [], function(tx, res) {
console.log("res.rows.length: " +
``` ```
res.rows.length + " -- должно быть 1";
console.log("res.rows.item(0).cnt: " + res.rows.item(0).cnt + " -- должно быть 1");
});
}, function(e) {
console.log("ERROR: " + e.message);
});
}
Этот случай также будет работать с Safari (WebKit), если вы замените window.sqlitePlugin.openDatabase
на window.openDatabase
.
window.sqlitePlugin.deleteDatabase("my.db", successcb, errorcb);
ПРИМЕЧАНИЕ: Это не реализовано для WP(8).
ПРИМЕЧАНИЕ: Этот плагин теперь готов к установке с помощью инструмента cordova
.
npm install -g cordova # если у вас нет cordova
cordova create MyProjectFolder com.my.project MyProject && cd MyProjectFolder # если вы только начинаете
cordova plugin add https://github.com/brodysoft/Cordova-SQLitePlugin
Более подробную информацию можно найти в этой статье (http://iphonedevlog.wordpress.com/2014/04/07/installing-chris-brodys-sqlite-database-with-cordova-cli-android/).
SQLitePlugin.coffee.md
: платформонезависимый (литературный кофе-скрипт, может быть прочитан последним компилятором кофе-скриптов)www
: SQLitePlugin.js
теперь платформонезависимsrc
: код плагина Java для Android; код плагина Objective-C для iOS; код C-sharp и библиотеки DLL для WP(8)test-www
: простое тестирование в index.html
с использованием qunit 1.5.0Lawnchair-adapter
: адаптер Lawnchair, основанный на версии из репозитория Lawnchair, с основным набором тестов Lawnchair в подкаталоге test-www
Эти инструкции по установке основаны на примере проекта Android от Cordova/PhoneGap 2.7.0. В первый раз распакуйте zip-архив PhoneGap 2.7 и используйте подкаталог lib/android/example
.
www/SQLitePlugin.js
из этого репозитория в подкаталог assets/wwwsrc/android/org/pgsqlite/SQLitePlugin.java
из этого репозитория в подкаталог src/org/pgsqlite<plugin name="SQLitePlugin" value="org.pgsqlite.SQLitePlugin"/>
в файл res/xml/config.xml
Пример изменения файла res/xml/config.xml
для Cordova/PhoneGap 2.x:
--- config.xml.orig 2013-07-23 13:48:09.000000000 +0200
+++ res/xml/config.xml 2013-07-23 13:48:26.000000000 +0200
@@ -36,6 +36,7 @@
<preference name="useBrowserHistory" value="true" />
<preference name="exit-on-suspend" value="false" />
<plugins>
+ <plugin name="SQLitePlugin" value="org.pgsqlite.SQLitePlugin"/>
<plugin name="App" value="org.apache.cordova.App"/>
<plugin name="Geolocation" value="org.apache.cordova.GeoBroker"/>
<plugin name="Device" value="org.apache.cordova.Device"/>
Перед сборкой в первый раз необходимо обновить проект желаемой версией Android SDK с помощью команды, подобной следующей:
android update project --path $(pwd) --target android-17
(предполагается, что используется Android SDK 17, здесь следует указать правильный желаемый номер Android SDK)
ПРИМЕЧАНИЕ: Использование этого плагина в Cordova до версии 3.0 требует внесения следующих изменений в SQLitePlugin.java:
--- src/android/org/pgsqlite/SQLitePlugin.java 2013-09-10 21:36:20.000000000 +0200
+++ SQLitePlugin.java.old 2013-09-10 21:35:14.000000000 +0200
@@ -17,8 +17,8 @@
import java.util.HashMap;
-import org.apache.cordova.CordovaPlugin;
-import org.apache.cordova.CallbackContext;
+import org.apache.cordova.api.CordovaPlugin;
+import org.apache.cordova.api.CallbackContext;
import android.database.Cursor;
В разделе «Проект» вкладки «Фазы сборки» выберите первое раскрывающееся меню «Связать двоичный файл с библиотеками» и добавьте библиотеку libsqlite3.dylib
или libsqlite3.0.dylib
.
ПРИМЕЧАНИЕ: В разделе «Фазы сборки» может быть несколько раскрывающихся меню «Связать двоичный файл с библиотеками». Пожалуйста, выберите первый, иначе он не будет работать.
Перетащите файлы .h и .m в папку плагинов вашего проекта (в xcode) — я всегда просто выбираю опцию «Создать ссылки». src/ в JavaScript с опцией функции оболочки верхнего уровня (по умолчанию).
Используйте полученный файл JavaScript в HTML.
Включите SQLitePlugin в config.xml
(Cordova/PhoneGap 2.x):
--- config.xml.old 2013-05-17 13:18:39.000000000 +0200
+++ config.xml 2013-05-17 13:18:49.000000000 +0200
@@ -39,6 +39,7 @@
<content src="index.html" />
<plugins>
+ <plugin name="SQLitePlugin" value="SQLitePlugin" />
<plugin name="Device" value="CDVDevice" />
<plugin name="Logger" value="CDVLogger" />
<plugin name="Compass" value="CDVLocation" />
Ручная установка — версия WP(8)
TODO
Быстрая проверка установки
Внесите изменения в index.html (или используйте пример кода), чтобы убедиться в правильности установки:
--- index.html.old 2012-08-04 14:40:07.000000000 +0200
+++ assets/www/index.html 2012-08-04 14:36:05.000000000 +0200
@@ -24,7 +24,35 @@
<title>PhoneGap</title>
<link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title">
<script type="text/javascript" charset="utf-8" src="cordova-2.0.0.js"></script>
- <script type="text/javascript" charset="utf-8" src="main.js"></script>
+ <script type="text/javascript" charset="utf-8" src="SQLitePlugin.js"></script>
+
+
+ <script type="text/javascript" charset="utf-8">
+ document.addEventListener("deviceready", onDeviceReady, false);
+ function onDeviceReady() {
+ var db = window.sqlitePlugin.openDatabase("Database", "1.0", "Demo", -1);
+
+ db.transaction(function(tx) {
+ tx.executeSql('DROP TABLE IF EXISTS test_table');
+ tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text, data_num integer)');
+
+ tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)", ["test", 100], function(tx, res) {
+ console.log("insertId: " + res.insertId + " -- probably 1"); // check #18/#38 is fixed
+ alert("insertId: " + res.insertId + " -- should be valid");
+
+ db.transaction(function(tx) {
+ tx.executeSql("SELECT data_num from test_table;", [], function(tx, res) {
+ console.log("res.rows.length: " + res.rows.length + " -- should be 1");
+ alert("res.rows.item(0).data_num: " + res.rows.item(0).data_num + " -- should be 100");
+ });
+ });
+
+ }, function(e) {
+ console.log("ERROR: " + e.message);
+ });
+ });
+ }
+ </script>
</head>
<body onload="init();" id="stage" class="theme">
sqlitePlugin
начинается со строчной буквы «sql».Если у вас возникла проблема с плагином, пожалуйста, проверьте следующее:
config.xml
.Если вы всё ещё не можете заставить что-то работать:
Затем вы можете опубликовать проблему на форуме Cordova-SQLitePlugin или создать новую тему.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )