1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mbyte-Cordova-SQLitePlugin

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Cordova/PhoneGap SQLitePlugin

Собственный интерфейс к SQLite в плагине Cordova/PhoneGap для Android/iOS/WP(8), с HTML5 Web SQL API.

Лицензия для версий Android и WP(8): MIT или Apache 2.0.

Лицензия для версии iOS: только MIT.

ВНИМАНИЕ: критическое изменение для версии Android

Автоматическое расширение файла базы данных «.db» теперь удалено для версии Android, для соответствия другим версиям. Для существующего приложения вам, возможно, придётся открыть существующую базу данных следующим образом:

var db = window.sqlitePlugin.openDatabase({name: "my.db"});

Также модель потоков изменена, как описано ниже.

Статус

  • Версия WP8 теперь интегрирована в сборку PhoneGap (ref: #99).
  • Пожалуйста, используйте форум Cordova-SQLitePlugin для поддержки сообщества.
  • Коммерческая поддержка доступна для интеграции SQLCipher с версиями Android и iOS.

Анонсы

  • Версия WP(8) теперь работает с классами библиотеки CSharp-SQLite (которые встроены и созданы из исходного кода) и проходит большинство тестов.
  • Изменения в фоновой обработке:
    • опция dbType теперь удалена;
    • версия Android теперь использует один поток на БД;
    • для версии iOS фоновая обработка с использованием пула потоков теперь обязательна;
    • для версии WP(8) фоновая обработка выполняется с одним потоком на транзакцию.
  • Исправления для работы с PouchDB от @nolanlawson.
  • Форум переименован в форум Cordova-SQLitePlugin (http://groups.google.com/group/Cordova-SQLitePlugin).
  • Новое местоположение: https://github.com/brodysoft/Cordova-SQLitePlugin.
  • Версию iOS теперь можно собрать либо с ARC, либо с MRC.

Основные моменты

  • Работает с инструментарием Cordova 3.x.
  • Замена для HTML5 SQL API, единственное изменение должно быть window.openDatabase() --> sqlitePlugin.openDatabase().
  • Отказоустойчивые вложенные транзакции с оптимизацией пакетной обработки.
  • Как описано в этой публикации (http://brodyspark.blogspot.com/2012/12/cordovaphonegap-sqlite-plugins-offer.html):
    • Хранит базу данных sqlite в известном расположении пользовательских данных, которое можно перенастроить, и iOS будет резервироваться с помощью iCloud.
    • Нет ограничения в 5 МБ, дополнительная информация по адресу: http://www.sqlite.org/limits.html.
  • Android и iOS работают с SQLCipher для шифрования (см. ниже).
  • Android поддерживается начиная с SDK 10 (также известного как Gingerbread, Android 2.3.3); Поддержка более старых версий доступна по запросу.

Некоторые приложения, использующие Cordova/PhoneGap SQLitePlugin

  • Приложение Get It Done от marcucio.com.
  • KAAHE Health Encyclopedia: официальное приложение о здоровье Королевства Саудовская Аравия.
  • Larkwire (версия iOS): узнайте песни птиц в увлекательной форме.
  • Tangorin (Android): Японский словарь от tangorin.com.

Известные проблемы

  • Удаление базы данных пока не реализовано для WP(8).
  • Вызовы db.executeSql() вызывают обратный вызов несколько раз.
  • Проблемы с db.close() & sqlitePlugin.deleteDatabase().
  • Использование веб-воркеров в настоящее время не поддерживается и известно, что оно не работает на Android.

Другие ограничения

  • Значения параметров версии БД, отображаемого имени и размера не поддерживаются и будут игнорироваться.
  • Плагин sqlite не будет работать до того, как будет запущен обратный вызов события «deviceready», как описано в разделе Использование.
  • Для iOS резервное копирование iCloud НЕ является необязательным и должно быть.
  • Версия Android не может работать с более чем 100 открытыми файлами БД из-за своей модели потоков.
  • Отсутствует обратный вызов создания БД.
  • Многостраничная архитектура пока не поддерживается.

Другие версии

Использование с SQLCipher

  • для версии Android: [этот блог]. Использование

Идея состоит в том, чтобы максимально точно эмулировать 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"});
  // ...
}

Примечание: имя файла базы данных должно включать расширение, если это необходимо.

Фоновая обработка

Модель потоков зависит от используемой версии:

  • Для Android — один фоновый поток на базу данных, всегда;
  • для iOS — фоновая обработка с использованием пула потоков (всегда);
  • для WP(8) версии — фоновая обработка одним потоком на транзакцию, который внутренне порождается библиотекой Cordova.

Пример с функцией 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.

Простая установка с помощью инструмента 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.0
  • Lawnchair-adapter: адаптер Lawnchair, основанный на версии из репозитория Lawnchair, с основным набором тестов Lawnchair в подкаталоге test-www

Ручная установка — версия для Android

Эти инструкции по установке основаны на примере проекта Android от Cordova/PhoneGap 2.7.0. В первый раз распакуйте zip-архив PhoneGap 2.7 и используйте подкаталог lib/android/example.

  • Установите www/SQLitePlugin.js из этого репозитория в подкаталог assets/www
  • Установите файл src/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;

Ручная установка — версия для iOS

Библиотека SQLite

В разделе «Проект» вкладки «Фазы сборки» выберите первое раскрывающееся меню «Связать двоичный файл с библиотеками» и добавьте библиотеку libsqlite3.dylib или libsqlite3.0.dylib.

ПРИМЕЧАНИЕ: В разделе «Фазы сборки» может быть несколько раскрывающихся меню «Связать двоичный файл с библиотеками». Пожалуйста, выберите первый, иначе он не будет работать.

Плагин SQLite

Перетащите файлы .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">

Общие ловушки и подводные камни

  • Имя класса плагина начинается с «SQL» заглавными буквами, но в Javascript объект sqlitePlugin начинается со строчной буквы «sql».
  • Попытка открыть базу данных до получения обратного вызова события «deviceready».

Поддержка

Сообщение о проблемах

Если у вас возникла проблема с плагином, пожалуйста, проверьте следующее:

  • Вы используете последнюю версию плагина Javascript и специфичный для платформы Java или Objective-C исходный код из этого репозитория.
  • Вы правильно установили Javascript и специфичные для платформы Java или Objective-C.
  • Вы включили правильные версии Javascript Cordova и SQLitePlugin.js и правильно указали путь.
  • Вы зарегистрировали плагин должным образом в config.xml.

Если вы всё ещё не можете заставить что-то работать:

  • Создайте простейшую тестовую программу, которую вы можете продемонстрировать проблему, включая следующие характеристики:
    • она полностью автономна, то есть использует только дополнительные библиотеки помимо cordova & SQLitePlugin.js;
    • если проблема связана с добавлением данных в таблицу, тестовая программа включает операторы, которые вы использовали для открытия базы данных и создания таблицы;
    • если проблема связана с извлечением данных из таблицы, тестовая программа включает операторы, которые вы использовали для открытия базы данных, создания таблицы и ввода данных, которые вы пытаетесь извлечь.

Затем вы можете опубликовать проблему на форуме Cordova-SQLitePlugin или создать новую тему.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mbyte-Cordova-SQLitePlugin.git
git@api.gitlife.ru:oschina-mirror/mbyte-Cordova-SQLitePlugin.git
oschina-mirror
mbyte-Cordova-SQLitePlugin
mbyte-Cordova-SQLitePlugin
master