делаю приложение которое предполагает работу с данными, в качестве хранилища естественно выбрал sqllite, но столкнулся с проблемой дело в том что мне нужно делать множественные insert & select в базу
но если с селектом дело нормально обстоит то вот с инсертом вообще никак, точнее с множественным инсертом
вот например инсерт одной записи

Выделить код

Код:

INSERT INTO test  VALUES  ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81')

работает нормально, а вот вставка нескольких строк


Выделить код

Код:

INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
 ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')

не работает
ведь должно  работать, вроди как, а не хочет

что я делаю не так?

bidlocoder пишет

не работает

1. Как не работает? Вызывает краш FF? Вызывает BSOD? Выбрасывает эксепшн? Просто не видно новых данных?
2. Вставляйте новые данные, особенно если их больше 1-й записи, так, как это обычно принято делать: явно открывайте транзакцию, используйте параметризированные statements, по завершении явно выдавайте commit/rollback. Кстати, для пакетной обработки нескольких statements у обертки sqlite в FF есть спец. метод mozIStorageConnection.executeAsync. Метод, как это следует из его названия, асинхронный.

вызывает эксепшн, ругается на синтаксис запроса

вот что пишет:
1)если запускаю в sqlLite Manager
SQLiteManager: Likely SQL syntax error: INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')

[ near ",": syntax error ]


Exception Name: NS_ERROR_FAILURE
Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]

2)если с приложения
[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: chrome://executejs/content/executejs/executeJS.js :: <TOP_LEVEL> :: line 235"  data: no]

bidlocoder пишет

вот что пишет:

Ну так у вас же

bidlocoder пишет
Выделить код

Код:

INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
 ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')

Не знаю, откуда вы взяли такой синтаксис вставки нескольких записей, но он явно не ANSI-шный, и поэтому вовсе не обязан работать в sqlite. ANSI-стандарт предполагает только 2 варианта использования insert: для одиночной записи -

insert into table_name [(columns_list)] values(values_list)

для нескольких записей -

insert into table_name [(columns_list)] select ...

И всё. Хотите вставить несколько записей с данными, заданными в виде значений - используйте несколько отдельных statements по одному на каждую запись

я уже пробовал, получается ну ОООООчень медленно(((
цикл 50 итераций около  10 сек

bidlocoder
Вставка 10 000 значений - меньше, чем за 1 секунду (и отнюдь не на мощном компьтере):

Выделить код

Код:

const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
try 
{
  var dbFile=Services.dirsvc.get("ProfD", Ci.nsILocalFile);
  dbFile.append("foo.sqlite");
  var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  var mDBConn = ssvc.openDatabase(dbFile);
  try{ mDBConn.executeSimpleSQL("drop table foo"); } catch(err){}
  mDBConn.executeSimpleSQL("create table foo(n integer)");
  var insertStatements=[];
  var insertSQL="insert into foo values(:n)";
  for(var i=0;i<10000;i++)
  {
    var statement=mDBConn.createStatement(insertSQL);
    statement.params.n=i;
    insertStatements.push(statement);
  }
  var startTime=new Date().getTime();
  mDBConn.beginTransaction();
  mDBConn.executeAsync(insertStatements, insertStatements.length, 
  {
    handleError: function(aError)
    {
      Services.console.logStringMessage(aError.message);
    },
    
    handleCompletion: function(aReason) 
    {
      if (aReason!=0)
      {
        Services.console.logStringMessage("executeAsync finished with reason: "+aReason);
        return;
      }
      mDBConn.commitTransaction();
      Services.console.logStringMessage("insert completed in " +(new Date().getTime()-startTime)+"msec");
      mDBConn.asyncClose(function()
      {
        Services.console.logStringMessage("connection closed");
      });
    },
    handleResult: function(aResultSet) {}
  });
} catch(err)
{
  Services.console.logStringMessage(err+"\n"+err.stack);
}

(точнее - ~250 мсек. на селероне 1.86 ГГц с 1 Мб ОЗУ).

Стало самому интересно насчет скорости - набросал и прогнал тесты для вставки 10 000 строк в разных вариантах. Тесты выложены здесь: http://pastebin.mozilla-russia.org/108842 (не стал приводить код в теме, т.к. кода достаточно много). Варианты по ссылке:
executeAsync - асинхронное выполнение параметризованного insert в транзакции (я немного изменил код, там параметризация делается через массив параметров)
executeSync - синхронное выполнение непараметризованного insert без транзакции
executeSyncX - синхронное выполнение непараметризованного insert в транзакции
executeSyncXX - синхронное выполнение параметризованного insert без транзакции
executeSyncXXX - синхронное выполнение параметризованного insert в транзакции.
Места распределились так:
1-е место по скорости отработки - асинхронное выполнение параметризованного insert в транзакции (меньше 100 мсек)
2-е место - синхронные варианты в транзакции (~250-300 мсек)
3-е место - варианты без транзакции. Есть ли разница в наличии параметризации, или нет, я так и не смог узнать, т.к. не хватило терпения дождаться окончания отработки каждого из них. Ждал минут по 10 точно.
Комментарии, думаю, излишни.

спасибо за дельный совет и приведенный код
разбираюсь что куда..............