androidsqlite3自定义分词器sqlite函数,求助

[转载]SQLITE创建用户自定义函数_sqlite数据库_ThinkSAAS
[转载]SQLITE创建用户自定义函数
[转载]SQLITE创建用户自定义函数
内容来源: 网络
实现一个用户自定义的函数分为两步。首先,写句柄。句柄实现一些你想通过SQL完成的功能。然后,注册句柄,为它提供SQL名称、参数的数量和一个指向句柄的指针。
例如,你想创建一个叫做hello_newman()的SQL函数,它返回文本&Hello Jerry&。在SQLite C API中,先创建一个C函数来实现此功能,如:void hello_newman(sqlite3_context* ctx, intnargs, sqlite3_value** values) {
/*Create Newman&s reply */
constchar *msg = "Hello Jerry";
/*Set the return value. Have sqlite clean up msg w/ sqlite_free(). */
sqlite3_result_text(ctx,msg, strlen(msg), sqlite3_free); }
不了解C和C API也没关系。这个句柄仅返回&Hello Jerry&。下面是实际使用它。使用sqlite3_create_function()函数注册这个句柄:
sqlite3_create_function(db,"hello_newman", 0, hello_newman);
第1个参数(db)是数据库连接。第2个参数是函数的名称,这个名称将出现在SQL中。第3个参数表示这个函数有0个参数(如果该参数值为-1,表示该函数接受可变数量的参数)。最后一个参数是C函数hello_newman()的指针,当SQL函数被调用时,通过这个指针来调用实际的函数。
一旦进行了注册,SQLite就知道了当遇到SQL函数调用hello_newman()时,它需要调用C函数hello_newman()来得到结果。现在,你可以在程序中执行SELECThello_newman()语句,它将返回单行单列的文本&HelloJerry&。
如前所述,很多语言扩展允许用各自的语言来实现用户自定义的函数。例如,Java、Perl等。不同的语言扩展用不同的方法注册函数,有些使用其本身语言的函数来完成此项工作,例如,在Ruby中使用block—one。
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信项目中用到数据库,最近新加需求所以要添加一张表;逻辑和代码都按照以前能正常使用的写(就差没复制了),结果在运行的时候报了一个没有表的异常。纠结了很久,后来没办法理了下思路,表没创建成功,应该是没执行建表的语句,一打印log,果然是的。然后我手动调用onCreate(SQLiteDatabase db)居然就没出问题了。所以才有个这个onCreate(SQLiteDatabase db)调用时机的疑惑。
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
SQliteOpenHelper是一个辅助类,主要用来管理数据库的创建和版本的管理。说onCreate的使用时机,就不能孤立另外的2个方法:onUpgrade,onOpen.参照sdk中的demo(记事本),大概是以下的使用场景:onCreate(SQLiteDatabase):在数据库第一次生产的时候会调用这个方法,一般我们在这个方法里边生产数据库表。 onUpgrade(SQLiteDatabase,int,int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据库表,并建立新的数据库表,当然是否还需要做其他的操作,完全取决于应用程序的需求。 onOpen(SQLiteDatabase):这是当打开数据库时的回调函数,一般也不会用到。
这个很容易理解,在数据库第一次被创建时调用onCreate函数,参看帮助文档对这个函数的说明:Called when the database is created for the first time.也就是说在第一次创建数据库时调用,而数据库被创建出来后这个函数就没有用了,系统将不会再调用它,如果你想给数据库中加入一个表,那么可以使用onUPgrade函数,或者像你所做的那样,手动来调用onCreate函数。
-----------------******注******------------------------注:实际情况中,我们总是通过一个类继承SQLiteOpenHelper来使用SQLite数据库,那么什么时候会调用onCreate函数呢?当我们产生这个类的对象的时候是不会调用onCreate函数的,只有第一次通过这个对象调用getReadableDatabase或者getWritableDatabase函数时才会调用onCreate函数,而如果调用过一次这个对象的getReadableDatabase或者getWritableDatabase函数后系统将不会再调用onCreate函数。
你们说的和我以前想的都没错,刚才我验证了:onCreate(SQLiteDatabase db)方法当且仅当数据库第一次创建的时候执行。如果想在已有的数据库上新增一张新表,只在onCreate(SQLiteDatabase db)方法中增加一条sql语句和修改版本号是不够的,还要在onUpgrade()函数中在调用一次OnCreate()函数。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("drop table if exists "+mTableName);
onCreate(db);
} catch (SQLException e) {
e.printStackTrace();
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (7760) 次2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
2013年3月 总版技术专家分月排行榜第三
2014年5月 移动开发大版内专家分月排行榜第一2014年4月 移动开发大版内专家分月排行榜第一
2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
2013年3月 总版技术专家分月排行榜第三
2014年5月 移动开发大版内专家分月排行榜第一2014年4月 移动开发大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 sqlite3自定义分词器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信