`
zuroc
  • 浏览: 1311254 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

Firefox插件(XUL)开发 学习笔记 2.数据库的基本用法

阅读更多
书接上文,mDBConn.createStatement可以创建一个sql语句的模板,然后可以传入参数执行.

执行过后在通过reset方法重置它.

这样做的好处是:
"""
If you are doing a statement many times, using a precompiled statement will give you a noticable performance improvement because the SQL query doesn't need to be parsed each time.
"""

?1 在用 bindXXXXXParameter 时对应的位置的 0 , 而 ?2 对应的是 1 ... 以此类推 ... 哎,搞不清楚Moillza那群家伙是怎么想的...

还有一种更直观(也更繁琐的)绑定参数的方法 :myfirstparam  .用法如下:

var statement = mDBConn.createStatement("SELECT * FROM foo WHERE a = :myfirstparam AND b > :mysecondparam");

var firstidx = statement.getParameterIndex(":myfirstparam");
statement.bindUTF8StringParameter(firstidx, "hello");

var secondidx = statement.getParameterIndex(":mysecondparam");
statement.bindInt32Parameter(secondidx, 1234);

两种方法是可以混合使用的.


不过还是有局限,像下面这种情况还是自己拼装sql吧,不过小心sql注入:
"""
If you want to use a WHERE clause with an IN ( value-list ) expression, Bindings won't work

var ids = "3,21,72,89";
var sql = "DELETE FROM table WHERE id IN ( "+ ids +" )";
"""

有时候,我们不需要取得sql语句的返回值,那么像下面这样就可以了.

var statement = mDBConn.createStatement("INSERT INTO my_table VALUES (?1)");
statement.bindInt32Parameter(52);
statement.execute();

!!!牢牢记住,用完statement后要reset它,否则后果如下.
Un-reset write statements will keep a lock on the tables and will prevent other statements from accessing it. Un-reset read statements will prevent writes.

这种调用方式可以确保有异常时也可以reset,don't worry about unnecessary resets.

var statement = connection.createStatement(...);
try {
  // use the statement...
} finally {
  statement.reset();
}

当然如果你用.execute(),它会自动reset的.

如果你想获得刚刚插入数据的id,那么这么玩吧.

var sql = "INSERT INTO contacts_table (number_col, name_col) VALUES (?1, ?2)"
var statement = mDBConn.createStatement(sql);
    statement.bindUTF8StringParameter(0, number);
    statement.bindUTF8StringParameter(1, name);
    statement.execute();
var rowid = mDBConn.lastInsertRowID;//最后一条Insert语句产生的id

还有事务,说实话,我很讨厌sql,更讨厌事务,所以大家还是自己看文档吧,我复制一个演示用法.不过注意一点,由于sqlite是用的文件锁,加了事务会快上很多很多,大概的比例是1个小时=1分钟...这个我是有过惨痛经历的.

var ourTransaction = false;
if (!mDBConn.transactionInProgress) {
  ourTransaction = true;
  mDBConn.beginTransactionAs(mDBConn.TRANSACTION_DEFERRED);
}

// ... use the connection ...

if (ourTransaction)
  mDBConn.commitTransaction();


ok,到此为止,数据库大概操作基本够用了.
吾生也有涯,而知也无涯,以有涯随无涯,殆己!
所以不研究更深入了,现在浏览一下各个对象的接口.

1.
mozIStorageConnection
http://developer.mozilla.org/en/MozIStorageConnection

其中 createFunction 以及相关函数是用来创建sqlite函数的,参见
http://www.sqlite.org/c3ref/create_function.html
这里是sqlite的一些内置函数
http://www.sqlite.org/lang_corefunc.html
http://www.sqlite.org/lang_aggfunc.html

此外,应该是调用函数而不自己在sql创建事务

函数
void close();
mozIStorageStatement createStatement(in AUTF8String aSQLStatement);
void executeSimpleSQL(in AUTF8String aSQLStatement);
boolean tableExists(in AUTF8String aTableName);
boolean indexExists(in AUTF8String aIndexName);
void beginTransaction();
void beginTransactionAs(in PRInt32 transactionType);
void commitTransaction();
void rollbackTransaction();


void createTable(in string aTableName, in string aTableSchema);
aTableName
    The name of the table to create; table names may consist of the letters A-Z in either upper or lower case, the underscore, and the digits 0-9. The first character must be a letter.
aTableSchema
    The table's schema. This should be specified using the same syntax the CREATE TABLE statement uses. For example: "foo INTEGER, bar STRING".


void createFunction(in AUTF8String aFunctionName, in long aNumArguments, in mozIStorageFunction aFunction);
void createAggregateFunction(in AUTF8String aFunctionName, in long aNumArguments, in mozIStorageAggregateFunction aFunction);
void removeFunction(in AUTF8String aFunctionName);
mozIStorageProgressHandler setProgressHandler(in PRInt32 aGranularity, in mozIStorageProgressHandler aHandler);
mozIStorageProgressHandler removeProgressHandler();

属性
connectionReady boolean Indicates whether or not the connection is open or ready to use. This is false if the
connection failed to open or if it has been closed.

databaseFile nsIFile The current database file. NULL if the database connection refers to an in-memory database.

lastInsertRowID long long The row ID from the last SQL INSERT operation.

lastError long The last sqlite error code that occurred.

lastErrorString AUTF8String The English error string reported by the sqlite library for the last sqlite operation.

schemaVersion long The schema version of the database. This should not be used until the database is ready. The version will be reported as 0 if not set. since Gecko 1.9 M8

transactionInProgress boolean Returns true if there is a transaction in progress on the database; otherwise returns false.

常量
TRANSACTION_DEFERRED 0 Default. The database lock is acquired when needed.
TRANSACTION_IMMEDIATE 1 Get a read lock on the database immediately.
TRANSACTION_EXCLUSIVE 2 Get a write lock on the database immediately.

2.
mozIStorageStatement

函数

mozIStorageStatement clone();
AUTF8String getParameterName(in unsigned long aParamIndex);
unsigned long getParameterIndex(in AUTF8String aName);
AUTF8String getColumnName(in unsigned long aColumnIndex);
unsigned long getColumnIndex(in AUTF8String aName);
void reset();

void bindUTF8StringParameter(in unsigned long aParamIndex, in AUTF8String aValue);
void bindStringParameter(in unsigned long aParamIndex, in AString aValue);
void bindDoubleParameter(in unsigned long aParamIndex, in double aValue);
void bindInt32Parameter(in unsigned long aParamIndex, in long aValue);
void bindInt64Parameter(in unsigned long aParamIndex, in long long aValue);
void bindNullParameter(in unsigned long aParamIndex);
void bindBlobParameter(in unsigned long aParamIndex, [array,const,size_is(aValueSize)] in octet aValue, in unsigned long aValueSize);

void execute();

boolean executeStep();
The reset() method must be called on the statement after the last call of executeStep.


AString escapeStringForLIKE(in AString aValue, in wchar aEscapeChar);
An AString of an escaped version of aValue (%, _ and the escape char are escaped with the escape char).
For example, we will convert "foo/bar_baz%20cheese" into "foo//bar/_baz/%20cheese" (if the escape char is '/').


属性

parameterCount unsigned long Number of parameters.
columnCount unsigned long Number of columns returned.
state long The current state.

常量
Constant Value Description
MOZ_STORAGE_STATEMENT_INVALID 0 The SQL statement is Invalid.
MOZ_STORAGE_STATEMENT_READY 1 The SQL statement is ready to be executed.
MOZ_STORAGE_STATEMENT_EXECUTING 2 The SQL statement is executing at the moment.


3.
mozIStorageValueArray

函数
long getTypeOfIndex(in unsigned long aIndex);
long getInt32(in unsigned long aIndex);
long long getInt64(in unsigned long aIndex);
double getDouble(in unsigned long aIndex);
AUTF8String getUTF8String(in unsigned long aIndex);
AString getString(in unsigned long aIndex);
void getBlob(in unsigned long aIndex, out unsigned long aDataSize, [array,size_is(aDataSize)] out octet aData);
boolean getIsNull(in unsigned long aIndex);

属性
numEntries unsigned long The number of entries in the array (each corresponding to a column in the database row).

常量
Constant Value Description
VALUE_TYPE_NULL 0 Null data type.
VALUE_TYPE_INTEGER 1 INTEGER data type.
VALUE_TYPE_FLOAT 2 FLOAT data type.
VALUE_TYPE_TEXT 3 TEXT data type.
VALUE_TYPE_BLOB 4 BLOB data type.


4.
mozIStorageService
函数
nsIFile backupDatabaseFile(in nsIFile aDBFile, in AString aBackupFileName, [optional] in nsIFile aBackupParentDirectory);
mozIStorageConnection openDatabase(in nsIFile aDatabaseFile);
mozIStorageConnection openSpecialDatabase(in string aStorageKey);
mozIStorageConnection openUnsharedDatabase(in nsIFile aDatabaseFile);
分享到:
评论
1 楼 sunfengcheng 2008-08-25  
很基础!但倒是很有必要!收了!

相关推荐

    Firefox插件(XUL)开发 学习笔记 - 1. 开发环境以及数据库一瞥

    这篇学习笔记将带你走进Firefox插件(XUL)开发的世界,并对开发环境的搭建以及数据库的初步使用进行介绍。 首先,要开始Firefox插件开发,你需要搭建一个合适的开发环境。这通常包括安装Firefox开发者版浏览器,因为...

    firefox插件开发,firefox plugin 开发 firefox 扩展 开发

    火狐浏览器(Firefox)插件开发涉及一系列技术与步骤,主要目标是创建增强或定制浏览器功能的软件组件。以下是对标题和描述中提及知识点的详细解释: 1. **开发环境搭建**: - 使用`-no-remote -P develop`参数...

    firefox插件开发文档

    Firefox 插件开发是Web开发领域的一个重要分支,它允许开发者为Mozilla Firefox浏览器创建自定义功能,以增强用户的浏览体验。Firefox插件通常被称为“扩展”或“附加组件”,它们可以实现从简单的小工具到复杂的...

    XUL开发手册.pdf

    XUL开发手册.pdf ...XUL开发手册.pdf提供了关于Firefox扩展的基本结构和开发过程的信息,包括扩展的基本结构、install.rdf文件、chrome.manifest文件和chrome目录的作用等信息,为开发者提供了有价值的参考信息。

    firefox插件开发教程

    ### Firefox插件开发教程:深入理解XUL与GUI设计 #### 概览 在现代互联网技术的推动下,浏览器插件成为了提升用户个性化体验的重要工具。对于Firefox浏览器而言,其强大的扩展性和对开发者友好的环境使得插件开发...

    xul_hta_demo.zip

    《初识XUL用户界面UI开发》XUL是Mozilia社区开发技术中的一员,总要是为用户界面UI服务,Firefox就XUL以及其它一系列相关的基础库开发出来的成功之作。事实证明XUL是成功的UI开发技术,本文以一个最简明的视角来向看...

    xul调用c++xpcom例子.rar

    XUL是一种基于XML的语言,用于构建跨平台的图形用户界面,常用于Firefox等Mozilla产品。它允许开发者定义UI元素、布局以及与之相关的逻辑。 接着,我们来谈谈XPCom。XPCom是Mozilla的组件模型,它允许不同语言之间...

    Firefox(火狐)浏览器 插件开发 DEMO VC6

    5. **Firefox Add-on SDK**: 除了传统的NPAPI方式,Firefox还提供了Add-on SDK,这是一套高级工具,允许开发者使用JavaScript和CSS来开发插件,简化了开发流程,但可能不适用于所有复杂的插件需求。 6. **安装和...

    firefox插件开发

    5. **XUL和XPCOM**:虽然WebExtensions已经成为主流,但对老版本Firefox插件开发有经验的开发者可能需要了解XUL(XML User Interface Language)和XPCOM(Cross Platform Component Object Model)。这两者是Firefox...

    我的Firefox插件开发之旅——从零开始

    作者计划学习XUL的用法,以便能够开发出自己的Firefox扩展。他还发现了一个在线的XUL编辑器,可以在编写XUL代码时实时预览界面效果。 知识点四:插件开发的准备工作 在开发Firefox插件之前,作者总结了几个准备工作...

    XUL开发手册(firefox)

    ### XUL开发手册详解 #### 一、XUL概述与重要性 XUL(XML User Interface ...通过本手册的学习,开发者可以掌握XUL的基本概念和技术要点,为进一步开发复杂且功能丰富的Firefox扩展和桌面应用打下坚实的基础。

    Firefox插件例子源码

    【Firefox插件例子源码】是一个关于Firefox浏览器插件开发的学习资源,包含了示例代码,可供开发者参考和学习。这个压缩包中包含了多个文件,它们各自在插件开发过程中扮演着不同的角色。以下是对这些文件及其相关的...

    firefox插件

    综上所述,这个主题涵盖了Firefox插件的基本概念、开发和使用,包括阅读和修改源码、利用开发工具进行插件制作,以及具体插件——Web Developer的安装和应用。对于那些想要深入了解Firefox插件开发或提升网页设计和...

    Programming.Firefox

    XUL overlays是早期的开发方式,依赖于Firefox的XUL(XML User Interface Language)和JavaScript进行交互,而WebExtensions则是目前推荐的方法,基于Chrome的API,具有更好的跨浏览器兼容性。 二、WebExtensions...

    firefox 插件说明

    Firefox插件是基于XUL(XML User Interface Language)和JavaScript开发的,这些技术使得插件能够与Firefox的内核进行交互。当用户在Firefox中安装插件后,它们会嵌入到浏览器中,对网页内容进行处理或者添加新的...

    mozilla_firefox_xul_spoof.nasl

    mozilla_firefox_xul_spoof

    我的Firefox插件开发之旅

    总之,Firefox插件开发涉及了对Extension和Plugin的理解,以及XUL等技术的学习和实践。通过逐步探索和研究,作者逐步掌握了开发流程,并开始了他们的Firefox插件开发之旅。对于想要涉足这一领域的开发者来说,这是一...

    firefox-50.0b11.win64.sdk

    它提供了丰富的API,使得开发者能够使用JavaScript和CSS来编写跨平台的Firefox扩展,而无需深入学习XUL或XPCOM。SDK的核心组件包括Core模块、Add-on Builder和Add-on SDK CLI(命令行接口)。 二、核心模块 Fire...

    vc开发火狐插件所需cpp,h等sdk

    要开发Firefox插件,开发者首先需要了解XUL(XML User Interface Language),这是Mozilla使用的语言来构建跨平台的用户界面。XUL结合了XML、CSS和JavaScript,允许创建可定制的界面元素。然而,对于更复杂的操作,...

Global site tag (gtag.js) - Google Analytics