玩转SQLite系列SQLite数据库应用案例实现历史搜索记录
sqlite3 query 例程
一、概述SQLite是一个轻量级的关系型数据库管理系统,它被广泛应用于移动设备和嵌入式系统中。
在开发中,我们经常会遇到需要使用SQLite3进行查询操作的情况。
为了更好地理解和掌握SQLite3的查询语句,下面将给出一些查询例程,希望能够帮助大家更好地使用SQLite3进行数据查询。
二、基本查询1. 查询所有数据在SQLite中,如果想查询某张表中的所有数据,可以使用如下语句:```SELECT * FROM table_name;```这条语句将返回table_name表中的所有数据。
2. 条件查询如果想查询表中满足一定条件的数据,可以使用如下语句:```SELECT * FROM table_name WHERE condition;```其中condition为满足的条件,可以是各种比较操作符、逻辑操作符等。
3. 聚合查询当需要对查询的结果进行聚合操作时,可以使用如下语句:```SELECT function(column_name) FROM table_name;```其中function为聚合函数,如SUM、AVG、COUNT等。
三、表连接查询在实际应用中,不同的数据可能拆分到多个表中,如果需要同时查询多张表的数据,就需要进行表连接查询。
SQLite3支持内连接、外连接等各种表连接方式。
1. 内连接内连接是最常用的连接方式,它会返回两个表中满足连接条件的数据。
可以使用如下语句进行内连接查询:```SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;```这条语句将返回table1和table2中满足连接条件的数据。
2. 外连接外连接是指将不满足连接条件的数据也一并返回,SQLite3支持左外连接和右外连接两种方式。
可以使用如下语句进行左外连接:```SELECT * FROM table1 LEFT OUTER JOIN table2 ONtable1.column = table2.column;```这条语句将返回table1中所有数据以及table2中满足连接条件的数据。
sqlite real例题
SQLite real例题SQLite 是一个轻量级的数据库系统,常用于移动应用和桌面应用中。
下面是一个使用SQLite 的简单例子,这是一个记录销售交易的数据库设计。
需求:我们需要记录销售的商品、数量、销售日期和销售员。
数据库设计:1.创建数据库:sqlCREATE DATABASE SalesDB;2.创建表:sqlCREATE TABLE Sales (id INTEGER PRIMARY KEY AUTOINCREMENT,product TEXT NOT NULL,quantity INTEGER NOT NULL,sale_date TEXT NOT NULL,sales_rep TEXT NOT NULL);3.插入数据:sqlINSERT INTO Sales (product, quantity, sale_date, sales_rep)VALUES ('iPhone 14', 10, '2023-10-23', 'John Doe');4.查询数据:•查询所有销售记录:sqlSELECT * FROM Sales;•查询特定销售员的所有销售记录:sqlSELECT * FROM Sales WHERE sales_rep = 'John Doe';•查询特定日期的所有销售记录:sqlSELECT * FROM Sales WHERE sale_date = '2023-10-23';5.更新数据:假设我们要增加一个销售记录的数量:sqlUPDATE Sales SET quantity = 5 WHERE product = 'iPhone 14';6.删除数据:假设我们要删除一个销售记录:sqlDELETE FROM Sales WHERE id = 1; -- 根据id来删除记录,这里假设要删除id为1的记录。
sqlite3检索算法
sqlite3检索算法SQLite3检索算法SQLite是一种轻量级的嵌入式关系型数据库管理系统,被广泛应用于各种平台和设备中。
在SQLite中,检索数据是数据库操作的核心之一。
SQLite3的检索算法主要基于B树索引和查询优化等核心原理。
本文将一步一步回答关于SQLite3检索算法的相关问题,深入探讨其实现及原理。
第一步:什么是B树索引?B树是一种自平衡的树形数据结构,被广泛应用于数据库和文件系统等领域,用于解决大规模数据的索引和查找问题。
B树索引在SQLite中起到加速数据检索的作用。
其主要特点是可以高效地支持平衡检索,使得数据的查找性能与数据量的增加基本无关。
第二步:B树索引在SQLite3中如何实现?SQLite3使用B+树作为主要的索引结构。
B+树是一种自平衡的多路搜索树,其特点是保持所有的数据都在叶子节点上,而非叶子节点仅用来索引和定位,这有助于提高查询性能。
当数据库中的表建立了索引之后,SQLite3会在磁盘上建立对应的B+树索引文件。
该文件的结构是一个页的集合,其中每个页的大小通常为4KB。
每个页被分为若干个块,每个块通常包含多个索引条目。
SQLite3使用B 树索引进行搜索的过程可以被分为两个主要的步骤:搜索树的根页以及在根页下搜索叶子页。
第三步:索引的搜索过程是怎样的?在SQLite3中,索引的搜索过程遵循下列步骤:1. 首先,打开索引文件,并读取根页的页号。
2. 然后,读取根页,并判断索引值是否在根页的索引条目范围内。
如果是,则跳到该索引条目对应的页,并重复此过程。
3. 如果索引值不在根页范围内,那么SQLite3会采取二分查找的方式寻找适当的索引条目。
通过比较索引值和中间索引条目的值,可以确定是否继续搜索左/右子树。
4. 如果找到叶子页,SQLite3将从该页读取相应的数据记录,并返回给用户。
需要注意的是,当索引的深度较大时,SQLite3可能需要在不同的页面之间频繁地进行I/O操作。
移动应用开发技术浏览历史记录保存方法
移动应用开发技术浏览历史记录保存方法随着智能手机的普及,人们越来越依赖移动应用程序来获取信息、进行购物和娱乐等活动。
对于应用程序开发者来说,了解用户的浏览历史记录是至关重要的,这有助于他们更好地了解用户的兴趣和行为,并提供更个性化的服务。
那么,如何有效地保存和管理移动应用程序的浏览历史记录呢?一、本地缓存方法在移动应用开发中,最常见的保存历史记录的方法是使用本地缓存。
本地缓存是指将用户的浏览历史记录保存在用户设备上的存储空间中,不需要网络连接即可访问。
开发者可以使用数据库、文件或偏好设置等形式进行本地缓存。
数据库是一种广泛应用的保存历史记录的方法。
通过使用SQLite等数据库技术,开发者可以轻松地创建、读取和更新历史记录。
这种方法可以高效地保存大量数据,并支持复杂的查询操作,适用于需要更多数据处理和分析的应用程序。
文件保存是另一种常见的本地缓存方法。
开发者可以将用户的浏览历史记录保存在文本文件、JSON文件或XML文件中。
这种方法不仅简单易用,而且对于一些轻量级的应用程序来说是足够的。
偏好设置是一种用于保存少量数据的简单方法。
开发者可以使用SharedPreferences或NSUserDefault等偏好设置工具来保存用户的浏览历史记录。
这种方法适用于只保存一些简单设置或配置信息的应用程序。
二、云端存储方法在一些需要多设备同步的应用程序中,使用云端存储是更好的选择。
云端存储是指将用户的浏览历史记录保存在服务器上,用户可以通过网络连接和不同的设备访问记录。
这种方法可以确保用户在不同设备上访问相同历史记录,提供更好的用户体验。
开发者可以使用云数据库(如Firebase)或云存储服务(如Amazon S3、Google Cloud Storage)来保存用户的浏览历史记录。
使用云数据库可以实现用户数据的实时同步和查询等功能,而使用云存储服务则可以保存用户的文件和图片等内容。
不过,使用云端存储方法需要考虑数据安全和隐私问题。
sqlite数据查询最后10条记录语句
sqlite数据查询最后10条记录语句摘要:1.SQLite 简介2.SQLite 数据查询基础3.获取最后10 条记录的语句正文:SQLite 是一种轻量级的数据库,它非常适合用于嵌入式设备和本地存储数据。
它具有可扩展性、高性能和易于使用的特点。
在这篇文章中,我们将介绍如何使用SQLite 数据库查询最后10 条记录。
首先,我们需要了解一些SQLite 数据查询的基础知识。
SQLite 使用结构化查询语言(SQL)进行数据查询。
要查询数据,我们需要使用SELECT 语句。
基本的SELECT 语句如下:```SELECT column1, column2, ...FROM table_nameWHERE condition;```其中,column1、column2 等表示要查询的列名,table_name 表示要查询的表名,condition 表示查询条件。
现在,我们来看如何获取最后10 条记录。
假设我们有一个名为"example"的表,其中包含以下列:id(主键)、name(姓名)和age(年龄)。
我们可以使用以下SQL 语句获取最后10 条记录:```sqlSELECT *FROM exampleORDER BY id DESCLIMIT 10;```这个语句首先使用ORDER BY 子句对数据按照id 进行降序排序,然后使用LIMIT 子句限制结果集只包含前10 条记录。
请注意,ORDER BY 子句和LIMIT 子句需要SQLite 版本支持。
较旧的SQLite 版本可能不支持这些功能。
在这种情况下,您需要使用其他方法获取最后10 条记录,例如使用游标遍历结果集。
总之,SQLite 是一种强大的轻量级数据库,可以用于各种场景。
要查询最后10 条记录,可以使用SELECT 语句配合ORDER BY 和LIMIT 子句。
sqlite数据查询最后10条记录语句
sqlite数据查询最后10条记录语句首先,我想解释一下什么是SQLite和它的基本概念。
SQLite是一个轻量级的关系型数据库管理系统。
它具有简单易用、零配置和开源的特点,适用于小型应用程序或嵌入式设备。
SQLite使用SQL语言进行数据查询和管理。
在SQLite中,数据以表的形式组织,每个表包含多个列和行。
列表示属性或字段,行表示数据库的记录。
要从表中查询数据,我们可以使用SELECT语句。
在这个场景中,我们想要查询最后10条记录,可以使用LIMIT子句和ORDER BY子句来实现。
首先,我们需要打开SQLite的命令行终端或使用SQLite的图形界面工具,然后连接到我们的数据库。
连接命令可能是类似于以下的形式:sqlite3 mydatabase.db其中`mydatabase.db`是我们的数据库文件名。
如果数据库文件不在当前目录,需要提供完整的文件路径。
接下来,我们需要确定要查询的表名。
假设我们的表名是`mytable`。
然后,我们可以使用以下语句查询最后10条记录:SELECT * FROM mytable ORDER BY rowid DESC LIMIT 10;在这个查询语句中,我们使用`SELECT *`来选择所有列,`FROM mytable`指定要查询的表名,`ORDER BY rowid DESC`按照`rowid`降序排列,`LIMIT 10`限制结果为最后10条记录。
需要注意的是,SQLite中有一个隐含的列`rowid`,它表示每条记录的唯一标识符。
如果表没有定义主键,`rowid`会自动创建。
在这个查询中,我们使用`rowid`来决定记录的顺序。
当我们运行这条查询语句时,SQLite会返回最后10条记录的结果集。
结果集将包含所有的列和相应的值。
如果我们想要查询其他特定的列,而不是所有的列,我们可以用列名替换`*`。
例如:SELECT column1, column2 FROM mytable ORDER BY rowid DESC LIMIT 10;这将只会返回`column1`和`column2`两列的值。
sqlite3查找结果顺序
sqlite3查找结果顺序标题:在数据库中使用SQLite3进行结果排序SQLite3是一种轻量级的嵌入式数据库管理系统,广泛应用于各种应用程序中。
在使用SQLite3进行查询时,我们经常需要对查询结果进行排序,以便更好地理解和分析数据。
下面将介绍如何在SQLite3中进行结果排序的方法。
1. 使用ORDER BY子句进行单个字段排序:在SQLite3中,可以使用ORDER BY子句对查询结果进行单个字段的升序或降序排序。
例如,如果我们有一个名为“students”的表,其中包含学生的姓名和分数两个字段,我们可以使用以下语句按分数进行升序排序:SELECT * FROM students ORDER BY score ASC;2. 使用ORDER BY子句进行多个字段排序:除了单个字段排序,SQLite3还允许我们使用ORDER BY子句对查询结果进行多个字段的排序。
例如,如果我们希望先按照分数进行升序排序,然后再按照姓名进行升序排序,可以使用以下语句:SELECT * FROM students ORDER BY score ASC, name ASC;3. 使用LIMIT子句限制结果数量:有时候我们只需要查询结果中的前几条记录,这时可以使用LIMIT 子句来限制结果数量。
例如,如果我们只想获取分数最高的5名学生的信息,可以使用以下语句:SELECT * FROM students ORDER BY score DESC LIMIT 5;4. 使用OFFSET子句跳过部分结果:如果我们想要跳过前几条记录,只查询后面的结果,可以使用OFFSET子句。
例如,如果我们想要获取排名第6到第10的学生信息,可以使用以下语句:SELECT * FROM students ORDER BY score DESC LIMIT 5 OFFSET 5; 5. 使用CASE语句实现自定义排序:有时候我们需要根据特定的规则对结果进行排序,这时可以使用CASE语句来实现自定义排序。
sqlite3的操作方法及应用
数据库的操作我们在这个项目中使用的是SQLITE3数据库软件。
通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中。
1.打开数据库,创建表1.1 sqlite * db; 定义一个sqlite * 的变量sqlite3_open(“./link.db”,&db);在当前目录下打开一个名为link.db的数据库,若是没有则在当前目录下创建一个名为link.db的数据库。
1.2 sql = "create table weblink(id integer primary key,domain text,page text,fromdomain text,status integer);"在已打开的数据库中创建一个名weblink的表。
表的属性如下:id integer primary key :ID号(表中黙认包含的)domain text :域名page text :子网页fromdomain text :源域名status integer :状态标志1.3 sqlite3_exec(db,sql,NULL,NULL,NULL);执行一条sql 语句的函数。
函数原型:int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg )第1个参数是前面open函数得到的指针。
说了是关键数据结构。
第2个参数const char *sql 是一条sql 语句,以\0结尾。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
(什么是回调函数,自己找别的资料学习)第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
sqlite 循环记录日志方法
sqlite 循环记录日志方法SQLite循环记录日志方法是通过使用一个循环语句将需要记录的日志逐条插入到SQLite数据库表中。
下面是一个简单展示循环记录日志的示例代码:```import sqlite3import time# 连接SQLite数据库conn = sqlite3.connect('log.db')c = conn.cursor()# 创建日志表c.execute('''CREATE TABLE IF NOT EXISTS logs (timestamp INTEGER, level TEXT, message TEXT)''')mit()# 定义一个循环函数,将需要记录的日志逐条插入到logs表中def log_loop(level, message):timestamp = int(time.time())c.execute('''INSERT INTO logs (timestamp, level, message) VALUES (?, ?, ?)''', (timestamp, level, message))mit()# 循环记录日志for i in range(10):log_level = 'Info'log_message = 'This is log number %s' % str(i)log_loop(log_level, log_message)# 关闭SQLite数据库连接conn.close()```以上示例代码中,我们首先连接了一个SQLite数据库,并创建了一个名为“logs”的日志表。
在定义循环函数log_loop时,我们使用了当前的时间戳来记录每个日志的时间,同时将日志等级和消息插入到SQLite表中。
Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解
Android操作SQLite数据库(增、删、改、查、分页等)及ListView显⽰数据的⽅法详解本⽂实例讲述了Android操作SQLite数据库(增、删、改、查、分页等)及ListView显⽰数据的⽅法。
分享给⼤家供⼤家参考,具体如下:由于刚接触android开发,故此想把学到的基础知识记录⼀下,以备查询,故此写的⽐较啰嗦:步骤如下:⼀、介绍:此⽂主要是介绍怎么使⽤android⾃带的数据库SQLite,以及把后台的数据⽤ListView控件显⽰⼆、新建⼀个android⼯程——DBSQLiteOperate⼯程⽬录:三、清单列表AndroidManifest.xml的配置为:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.dboperate"android:versionCode="1"android:versionName="1.0" ><uses-sdk android:minSdkVersion="8" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><!--单元测试加这句--><uses-library android:name="android.test.runner" /><activityandroid:name=".DBSQLiteOperateActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application><instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.example.dboperate"android:label="Test for my app"/></manifest>四、main.xml配置清单:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:id="@+id/name"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/name"android:gravity="center"/><TextViewandroid:id="@+id/phone"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/phone"android:gravity="center"/><TextViewandroid:id="@+id/amount"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/amount"android:gravity="center"/></LinearLayout><ListViewandroid:id="@+id/listView"android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView></LinearLayout>五、item.xml配置清单:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal" ><TextViewandroid:id="@+id/name"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/name"android:gravity="center"/><TextViewandroid:id="@+id/phone"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/phone"android:gravity="center"/><TextViewandroid:id="@+id/amount"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/amount"android:gravity="center"/></LinearLayout>六、string.xml配置清单:<?xml version="1.0" encoding="utf-8"?><resources><string name="hello">Hello World, DBSQLiteOperateActivity!</string><string name="app_name">ExampleDBSQLiteOperate8</string><string name="name">姓名</string><string name="phone">电话</string><string name="amount">存款</string></resources>七、DBSQLiteOperateActivity.java Activity类的源码:package com.example.dboperate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.example.adapter.PersonAdapter;import com.example.domain.Person;import com.example.service.PersonService;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.SimpleCursorAdapter;import android.widget.Toast;public class DBSQLiteOperateActivity extends Activity {ListView listView;PersonService personService;OnItemClickListener listViewListener;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);listViewListener = new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//得到listView控件ListView listView = (ListView)parent;//1、如果使⽤⾃定义适配器,返回的是Person对象//得到该条⽬数据// Person person = (Person)listView.getItemAtPosition(position);// //⼴播出去// Toast.makeText(getApplicationContext(), person.toString(), Toast.LENGTH_LONG).show(); //2、如果使⽤showList2()⽅法中的适配器时,则取得的值是不⼀样的,返回的是cursor// Cursor cursor = (Cursor)listView.getItemAtPosition(position);// int personid = cursor.getInt(cursor.getColumnIndex("_id"));// Toast.makeText(getApplicationContext(), personid+"", Toast.LENGTH_LONG).show();//3、如果使⽤showList()⽅法中的适配器时,则取得的值是不⼀样的,返回的是map@SuppressWarnings("unchecked")Map<String,Object> map = (Map)listView.getItemAtPosition(position);String name = map.get("name").toString();String personid = map.get("personid").toString();Toast.makeText(getApplicationContext(), personid +"-"+ name, Toast.LENGTH_LONG).show(); }};listView = (ListView) this.findViewById(R.id.listView);listView.setOnItemClickListener(listViewListener);personService = new PersonService(this);showList();}private void showList() {List<Person> persons = personService.getScrollData(0, 50);List<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>();for(Person person : persons){HashMap<String,Object> item = new HashMap<String,Object>();item.put("name", person.getName());item.put("phone", person.getPhone());item.put("amount", person.getAmount());item.put("personid", person.getId());data.add(item);}SimpleAdapter adapter = new SimpleAdapter(this,data,yout.item, new String[]{"name","phone","amount"}, new int[]{,R.id.phone,R.id.amount});listView.setAdapter(adapter);}public void showList2(){Cursor cursor = personService.getCursorScrollData(0, 50);//该适配器要求返回的结果集cursor必须包含_id字段,所以需要对取得结果集进⾏处理SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,yout.item,cursor,new String[]{"name","phone","amount"}, new int[]{,R.id.phone,R.id.amount} ); listView.setAdapter(adapter);}/*** ⾃定义适配器*/public void showList3(){List<Person> persons = personService.getScrollData(0, 50);/*** 第⼀个参数:上下⽂context,第⼆个参数:要显⽰的数据,第三个参数:绑定的条⽬界⾯*/PersonAdapter adapter = new PersonAdapter(this, persons, yout.item);listView.setAdapter(adapter);}}⼋、person.java 实体类源码:package com.example.domain;public class Person {private Integer id;private String name;private String phone;private Integer amount;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Person(String name, String phone) { = name;this.phone = phone;}public Person(Integer id, String name, String phone,Integer amount) {super();this.id = id; = name;this.phone = phone;this.amount = amount;}public Person() {super();}public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", phone=" + phone+ ", amount=" + amount + "]";}}九、DBOperateHelper.java 业务类源码:package com.example.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBOperateHelper extends SQLiteOpenHelper {public DBOperateHelper(Context context) {//默认创建的数据库⽂件保存在<包名>/database///第⼀个参数是上下⽂,第⼆个参数是数据库名称,第三个是游标⼯⼚为null时使⽤数据库默认的游标⼯⼚,第四个是数据库版本号但是不能为0,⼀般⼤于0super(context, "smallpig", null, 4);}/*** 数据库每⼀次被创建时被调⽤*/@Overridepublic void onCreate(SQLiteDatabase sqldb) {sqldb.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone varchar(12) null)");}/*** 每⼀次数据库版本号发⽣变动时触发此⽅法* ⽐如如果想往数据库中再插⼊⼀些表、字段或者其他信息时通过修改数据库版本号来触发此⽅法*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//db.execSQL("alter table person add phone varchar(12) null");\db.execSQL("alter table person add amount Integer null");}}⼗、PersonService.java 业务类源码:package com.example.service;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.example.domain.Person;public class PersonService {private DBOperateHelper dbOperateHelper;public PersonService(Context context) {this.dbOperateHelper = new DBOperateHelper(context);}/*** 保存记录* @param person*/public void save(Person person){//得到数据库实例,⾥⾯封装了数据库操作⽅法SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("insert into person(name,phone) values('"+person.getName()+"','"+person.getPhone()+"')");//利⽤占位符可以避免注⼊,但是注意数组参与与占位符对应的字段要⼀⼀对应sqldb.execSQL("insert into person(name,phone,amount) values(?,?,?)",new Object[]{person.getName(),person.getPhone(),person.getAmount()});//关闭数据库sqldb.close();}/*** 删除记录* @param id*/public void delete(Integer id){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();sqldb.execSQL("delete from person where personid=?",new Object[]{id});sqldb.close();}/*** 更新记录* @param person*/public void update(Person person){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();sqldb.execSQL("update person set name=?,phone=?,amount=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getAmount(),person.getId()}); sqldb.close();}/*** 通过ID查询记录* @param id* @return*/public Person find(Integer id){/*** getWritableDatabase 与 getReadableDatabase 的区别:* getReadableDatabase会先返回getWritableDatabase(可写),如果调⽤getWritableDatabase失败* 则才会调⽤getReadableDatabase后续⽅法,使数据库只读* 当写⼊的数据超过数据库⼤⼩则调⽤getWritableDatabase会失败* 所以只读时则可以使⽤此⽅法,其它情况(只要不是超过数据库⼤⼩)也可以使⽤此⽅法*/SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});int personid;String name;String phone;int amount;Person person = null;if(cursor.moveToFirst()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);}cursor.close();return person;}/*** 返回指定长度记录,limit 3,5,适⽤于分页* @param offset 起始* @param maxResult 长度* @return*/public List<Person> getScrollData(int offset,int maxResult){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select * from person order by personid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)});int personid;String name;String phone;int amount;Person person = null;List<Person> persons = new ArrayList<Person>();while(cursor.moveToNext()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);persons.add(person);}cursor.close();return persons;}/*** 返回cursor* @param offset 起始* @param maxResult 长度* @return*/public Cursor getCursorScrollData(int offset,int maxResult){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select personid as _id,name,phone,amount from person order by personid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)}); return cursor;}/*** 返回总记录数* @return*/public long getCount(){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select count(*) from person", null);//该查询语句值返回⼀条语句cursor.moveToFirst();long result = cursor.getLong(0);cursor.close();return result;}public void payment(){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();sqldb.beginTransaction();//开启事务try{sqldb.execSQL("update person set amount = amount -10 where personid=1");sqldb.execSQL("update person set amount = amount + 10 where personid=2");sqldb.setTransactionSuccessful();//设置事务标志位true} finally {//结束事务:有两种情况:commit\rollback,事务提交或者回滚是由事务的标识决定的//事务为ture则提交,事务为flase则回滚,默认为falsesqldb.endTransaction();}}}⼗⼀、OtherPersonService.java 业务类源码:package com.example.service;import java.util.ArrayList;import java.util.List;import com.example.domain.Person;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class OtherPersonService {private DBOperateHelper dbOperateHelper;public OtherPersonService(Context context) {this.dbOperateHelper = new DBOperateHelper(context);}/*** 保存记录* @param person*/public void save(Person person){//得到数据库实例,⾥⾯封装了数据库操作⽅法SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("insert into person(name,phone) values('"+person.getName()+"','"+person.getPhone()+"')");//利⽤占位符可以避免注⼊,但是注意数组参与与占位符对应的字段要⼀⼀对应//sqldb.execSQL("insert into person(name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()});ContentValues values = new ContentValues();values.put("name", person.getName());values.put("phone", person.getPhone());values.put("amount", person.getAmount());//第⼀个参数是表名,第三个为字段值集合,第⼆个参数是空值字段,当第三个字段值集合为空时,系统会⾃动插⼊⼀条第⼆个参数为空的sql语句//否则当第三个参数为空时,如果第⼆个参数也为空,那么插⼊表就会找不到插⼊的字段信息,会报错sqldb.insert("person", "name", values );//关闭数据库sqldb.close();}/*** 删除记录* @param id*/public void delete(Integer id){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("delete from person where personid=?",new Object[]{id});//第⼀个参数是表名,第⼆个是where后⾯的条件⽤占位符表⽰,第三个对应占位符为参数值sqldb.delete("person", "personid=?", new String[]{Integer.toString(id)});sqldb.close();}/*** 更新记录* @param person*/public void update(Person person){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("update person set name=?,phone=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getId()});//第⼀个参数为表名,第⼆个是⼀个更新值集合,采⽤键值对的形式,每个更新的字段对应更新值//第三个参数是where后⾯条件字段⽤占位符标识,第四个参数是对应where占位符的值ContentValues values = new ContentValues();values.put("name", person.getName());values.put("phone", person.getPhone());values.put("amount", person.getAmount());sqldb.update("person", values , "personid=?", new String[]{person.getId().toString()});sqldb.close();}/*** 通过ID查询记录* @param id* @return*/public Person find(Integer id){/*** getWritableDatabase 与 getReadableDatabase 的区别:* getReadableDatabase会先返回getWritableDatabase(可写),如果调⽤getWritableDatabase失败* 则才会调⽤getReadableDatabase后续⽅法,使数据库只读* 当写⼊的数据超过数据库⼤⼩则调⽤getWritableDatabase会失败* 所以只读时则可以使⽤此⽅法,其它情况(只要不是超过数据库⼤⼩)也可以使⽤此⽅法*/SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();//Cursor cursor = sqldb.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});//第⼀个参数是表名;第⼆个参数是查询显⽰的字段,null时默认查询显⽰所有字段;//第三个参数是where查询条件占位符;第四个是占位符对应的值;//第五个参数是group by条件;第六个是having条件;第七个是order by条件Cursor cursor = sqldb.query("person", null, "personid=?", new String[]{id.toString()}, null, null, null);int personid;String name;String phone;int amount;Person person = null;if(cursor.moveToFirst()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);}cursor.close();return person;}/*** 返回指定长度记录,limit 3,5,适⽤于分页* @param offset 起始* @param maxResult 长度* @return*/public List<Person> getScrollData(int offset,int maxResult){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();//Cursor cursor = sqldb.rawQuery("select * from person order by personid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)}); //第⼀个参数是表名;第⼆个参数是查询显⽰的字段,null时默认查询显⽰所有字段;//第三个参数是where查询条件占位符;第四个是占位符对应的值;//第五个参数是group by条件;第六个是having条件;第七个是order by条件//第⼋个参数是limit ?,? 条件Cursor cursor = sqldb.query("person", null, null, null, null, null, "personid",offset+","+maxResult); int personid;String name;String phone;int amount;Person person = null;List<Person> persons = new ArrayList<Person>();while(cursor.moveToNext()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);persons.add(person);}cursor.close();return persons;}/*** 返回总记录数* @return*/public long getCount(){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();//Cursor cursor = sqldb.rawQuery("select count(*) from person", null);//第⼀个参数是表名;第⼆个参数是查询显⽰的字段,null时默认查询显⽰所有字段;//第三个参数是where查询条件占位符;第四个是占位符对应的值;//第五个参数是group by条件;第六个是having条件;第七个是order by条件Cursor cursor = sqldb.query("person", new String[]{"count(*)"}, null, null, null, null, null);//该查询语句值返回⼀条语句cursor.moveToFirst();long result = cursor.getLong(0);cursor.close();return result;}}⼗⼆、PersonServiceTest.java 单元测试类源码:package com.example.test;import java.util.List;import com.example.domain.Person;import com.example.service.DBOperateHelper;import com.example.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class PersonServiceTest extends AndroidTestCase {public void testCreateDB() throws Exception{DBOperateHelper dbHelper = new DBOperateHelper(getContext());dbHelper.getWritableDatabase();}public void testSave() throws Exception{PersonService ps = new PersonService(getContext());for(int i=1;i<=100;i++){Person person = new Person();person.setName("我是"+i);person.setPhone(String.valueOf(Long.parseLong("188********")+i));ps.save(person);Log.i("PersonService",person.toString());}}public void testDelete() throws Exception{PersonService ps = new PersonService(getContext());ps.delete(10);}public void testUpdate() throws Exception{PersonService ps = new PersonService(getContext());ps.update(new Person(1,"xiaopang","188********",0));}public void testFind() throws Exception{PersonService ps = new PersonService(getContext());Person person = ps.find(1);Log.i("PersonService", person.toString());}public void testGetScrollData() throws Exception{PersonService ps = new PersonService(getContext());List<Person> persons = ps.getScrollData(3, 5);for(Person person:persons){Log.i("PersonService",person.toString());}}public void testGetCount() throws Exception{PersonService ps = new PersonService(getContext());Long count = ps.getCount();Log.i("PersonService",count.toString());}public void testUpdateAmount() throws Exception{PersonService ps = new PersonService(getContext());Person person1 = ps.find(1);Person person2 = ps.find(2);person1.setAmount(100);person2.setAmount(100);ps.update(person1);ps.update(person2);}public void testPayment() throws Exception{PersonService ps = new PersonService(getContext());ps.payment();}}⼗三、OtherPersonServiceTest 单元测试类源码:package com.example.test;import java.util.List;import com.example.domain.Person;import com.example.service.DBOperateHelper;import com.example.service.OtherPersonService;import android.test.AndroidTestCase;import android.util.Log;public class OtherPersonServiceTest extends AndroidTestCase {public void testCreateDB() throws Exception{DBOperateHelper dbHelper = new DBOperateHelper(getContext());dbHelper.getWritableDatabase();}public void testSave() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());for(int i=1;i<=100;i++){Person person = new Person();person.setName("我是"+i);person.setPhone(String.valueOf(Long.parseLong("188********")+i));ps.save(person);Log.i("PersonService",person.toString());}}public void testDelete() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());ps.delete(10);}public void testUpdate() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());ps.update(new Person(1,"xiaopang","188********",0));}public void testFind() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());Person person = ps.find(1);Log.i("PersonService", person.toString());}public void testGetScrollData() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());List<Person> persons = ps.getScrollData(3, 5);for(Person person:persons){Log.i("PersonService",person.toString());}}public void testGetCount() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());Long count = ps.getCount();Log.i("PersonService",count.toString());}}⼗四、注意事项以及相关知识点:1、掌握SQLite数据库如何创建数据库、建⽴表、维护字段等操作继承SQLiteOpenHelper类,构造函数调⽤⽗类构造函数创建数据库,利⽤onCreate创建表,利⽤onUpgrade更新表字段信息2、掌握SQLite数据库如何增、删、改、查以及分页取得SQLiteDatabase的实例,然后调⽤该实例的⽅法可以完成上述操作SQLiteDataBase提供两种操作上述功能的⽅式:⼀是直接调⽤execSQL书写sql语句,另⼀种是通过insert、update、delete、query等⽅法来传值来拼接sql,前⼀种适合熟练掌握sql 语句的3、对需要数据同步的处理请添加事务处理,熟悉事务的处理⽅式4、了解各个⽅法参数的意义以及传值5、掌握ListView显⽰后台数据的使⽤⽅法SimpleAdapter、SimpleCursorAdapter以及⾃定义适配器的使⽤,以及OnItemClickListener取值时各个适配器返回值的区别以及取值⽅法6、多学、多记、多练、多思,加油!更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
sqllite sql记录
sqllite sql记录SQLite是一种轻量级的关系型数据库管理系统,支持SQL语言。
它是一种嵌入式数据库,意味着它可以直接集成到应用程序中,不需要独立的服务器进程。
SQLite的设计目标是将简单、小型、高效作为其主要特点,它的核心库文件非常小,只需要几百KB的空间。
本文将介绍SQLite的一些常用的SQL记录操作。
一、创建表格在SQLite中,使用CREATE TABLE语句可以创建表格。
例如,我们可以创建一个名为“users”的表格,包含id、name和age三个字段,分别表示用户的ID、姓名和年龄。
CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT,age INTEGER);二、插入数据使用INSERT INTO语句可以向表格中插入数据。
例如,我们可以向“users”表格中插入一条记录,表示一个名为“John”的用户,年龄为25岁。
INSERT INTO users (name, age) VALUES ('John', 25);三、查询数据使用SELECT语句可以从表格中查询数据。
例如,我们可以查询“users”表格中所有用户的姓名和年龄。
SELECT name, age FROM users;四、更新数据使用UPDATE语句可以更新表格中的数据。
例如,我们可以将“users”表格中姓名为“John”的用户的年龄更新为30岁。
UPDATE users SET age = 30 WHERE name = 'John';五、删除数据使用DELETE语句可以删除表格中的数据。
例如,我们可以删除“users”表格中姓名为“John”的用户。
DELETE FROM users WHERE name = 'John';六、排序数据使用ORDER BY子句可以对查询结果进行排序。
例如,我们可以按照用户的年龄对“users”表格进行升序排序。
sqlite数据查询最后10条记录语句
sqlite数据查询最后10条记录语句SQLite是一款轻量级的数据库,它具有高效、小巧、易用等特点,被广泛应用于各种项目中。
在日常开发中,我们可能会遇到需要查询数据库中最后10条记录的情况,那么如何实现这一功能呢?下面将详细介绍SQLite中查询最后10条记录的方法。
1.SQLite数据库简介SQLite是一款开源的轻量级数据库,它自带了一个完整的SQL引擎,可以实现对数据的增、删、改、查等操作。
SQLite的数据存储格式为纯文本,因此查询速度快、占用资源少。
2.查询最后10条记录的方法要在SQLite中查询最后10条记录,我们可以利用事务和行级锁的功能。
在查询之前,先锁定表,然后从表的末尾开始查询,这样可以确保查询到的是最后10条记录。
3.编写SQL查询语句以下是一个查询最后10条记录的SQL语句示例:```sqlBEGIN TRANSACTION;SELECT * FROM (SELECT * FROM your_table_nameORDER BY rowid DESCLIMIT 10) AS last_10_records;COMMIT;```在这个示例中,`your_table_name`需要替换为实际的数据表名。
通过事务和行级锁,我们可以确保查询到的数据是表中最后10条记录。
4.示例及解释假设我们有一个名为`employees`的表,包含以下字段:`id`、`name`、`salary`。
我们可以使用以下SQL语句查询最后10条记录:```sqlBEGIN TRANSACTION;SELECT * FROM (SELECT * FROM employeesORDER BY rowid DESCLIMIT 10) AS last_10_records;COMMIT;```执行此查询后,我们将得到表`employees`中最后10条记录的信息。
这个方法同样适用于其他类型的数据表,只需将表名和字段名替换即可。
sqlite3_log 用法
sqlite3_log用法SQLite是一款轻型的关系型数据库,广泛应用于嵌入式、Web开发等领域。
在SQLite中,sqlite3_log()函数用于记录系统级别的日志信息。
通过使用sqlite3_log()函数,开发者可以更好地了解数据库操作的过程和结果,从而进行性能优化和故障排查。
一、sqlite3_log()函数简介sqlite3_log()函数是SQLite数据库引擎提供的一个接口,用于记录日志信息。
它接受三个参数:消息类型、消息内容和数据库句柄。
消息类型用于标识日志信息的类型,消息内容用于提供具体的日志信息,数据库句柄用于指定发生日志事件的数据库连接。
二、用法示例下面是一个使用sqlite3_log()函数的示例代码:```c#include<sqlite3.h>#include<stdio.h>intmain(){sqlite3*db;intrc;rc=sqlite3_open("test.db",&db);if(rc!=SQLITE_OK){printf("无法打开数据库:%s\n",sqlite3_errmsg(db));returnrc;}//执行一些数据库操作...//记录日志信息sqlite3_log(SQLITE_LOG_TRANSACTION,"开始事务",db);sqlite3_log(SQLITE_LOG_ERROR,"发生错误",db);sqlite3_log(SQLITE_LOG_CREATE_TABLE,"创建表成功",db);//关闭数据库连接sqlite3_close(db);return0;}```在上述示例中,我们首先打开一个名为"test.db"的数据库连接,并在执行一些数据库操作后,使用sqlite3_log()函数记录了三条不同类型的日志信息。
sqlite 循环记录日志方法
SQLite 循环记录日志方法1. 介绍SQLite是一种轻量级的嵌入式关系型数据库管理系统,被广泛应用于各种应用程序中。
在开发过程中,记录日志是非常重要的一项任务。
本文将介绍SQLite数据库如何实现循环记录日志的方法。
2. SQLite 基础知识在开始讨论如何循环记录日志之前,我们需要了解一些SQLite的基础知识。
2.1 安装和配置SQLite要使用SQLite,我们首先需要安装SQLite软件包,并将其配置到我们的开发环境中。
具体的安装和配置步骤可以参考SQLite的官方文档。
2.2 SQLite数据库SQLite数据库是一个文件,用于存储和管理数据。
我们可以通过SQLite提供的命令行工具或者编程语言的API来访问和操作数据库。
2.3 SQLite表数据库中的数据是以表的形式组织的。
每个表包含一些列和行,其中列定义了表中数据的类型和属性,行则代表了具体的数据记录。
2.4 SQLiteSQLSQLite使用SQL(Structured Query Language)来操作数据库。
SQL是一种用于与数据库交互的标准语言,可以用于查询、插入、更新和删除数据。
3. 循环记录日志的需求分析在某些情况下,我们需要循环记录日志以保留一定数量的日志记录。
这对于跟踪问题、排查错误或者性能分析非常有帮助。
下面是一些常见的需求:1.保存最近n条日志,自动删除旧记录。
2.将日志记录限制在特定时间范围内。
3.对日志记录进行分级存储,以实现更细粒度的控制。
4.在数据库大小达到一定阈值时自动清理旧的日志记录。
5.支持查询和分析日志。
4. 实现循环记录日志的方法4.1 创建日志表首先,我们需要创建一个用于存储日志的SQLite表。
可以为每条日志定义一些字段,如时间戳、日志级别、日志内容等。
CREATE TABLE logs (id INTEGER PRIMARY KEY AUTOINCREMENT,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,level TEXT,message TEXT);4.2 插入日志记录当我们需要记录日志时,可以使用INSERT语句将日志记录插入到表中。
基于SQLite数据库的历史航迹管理系统设计与开发
基于SQLite数据库的历史航迹管理系统设计与开发作者:刘峰陈福良来源:《计算机时代》2020年第11期摘要:為了解决指控系统中对实时目标历史航迹的显示需求,设计了一种基于SQLite数据库的历史航迹管理系统。
结合当前指控系统的实际情况,将历史航迹管理系统划分为系统外部通信模块、态势处理模块、存储处理模块和人机交互模块。
在商用计算机上对系统存储和查询性能进行了测试,测试结果满足指控系统的实际使用需求。
关键词:指控系统; 历史航迹; 数据库; SQLite中图分类号:TP311.1 文献标识码:A 文章编号:1006-8228(2020)11-58-05Abstract: In order to solve the requirement of displaying the real-time target historical voyage track in the Command and Control System, this paper designs a historical track management system by using SQLite database. Combining with the actual situation of the current Command and Control System, the historical track management system is divided into external communication module,situation processing module, storage processing module and human-computer interaction module. The system is implemented on a commercial computer,and its storage and query performance are tested, the test results meet the actual requirements of the Command and Control System.Key words: Command and Control System; historical track; database; SQLite0 引言随着舰船装备雷达系统的快速发展,在对目标定位过程中,产生海量的航迹数据,而现有的指控系统中,为了保证实时目标的响应时间,一般只支持目标少量历史航迹点的显示。
sqlite3_log 用法 -回复
sqlite3_log 用法-回复“sqlite3_log 用法”指的是使用SQLite数据库中的sqlite3_log函数来记录和输出日志信息的方法。
SQLite是一款轻量级、嵌入式的关系型数据库管理系统,它提供了一个内置的日志记录功能,使开发人员能够追踪和调试数据库操作过程中的问题。
在本文中,我将详细介绍sqlite3_log函数的用法,并提供一步一步的说明,以帮助读者了解如何使用该函数记录和输出日志信息。
第一步:了解sqlite3_log函数的基本信息和功能sqlite3_log函数是SQLite C/C++接口提供的一个用于记录和输出日志信息的函数。
它的声明如下:cvoid sqlite3_log(int iErrCode, const char *zFormat, ...);其中,iErrCode参数表示日志信息的错误代码,zFormat参数表示日志信息的格式字符串,后续的可变参数用于替换格式字符串中的占位符。
sqlite3_log函数的功能主要有两个方面:1. 输出日志信息:将格式化的日志信息输出到SQLite默认的日志输出设备(通常是标准错误输出)。
2. 记录日志信息:将日志信息保存到syslog中(如果编译选项使用了-SYSLOG)或者通过回调函数(sqlite3_config(SQLITE_CONFIG_LOG, ...))进行自定义处理。
第二步:设置日志记录回调函数(可选)如果想使用自定义的方式处理日志信息(如记录到文件或其他设备),可以设置一个回调函数,并将其传递给sqlite3_config函数,如下所示:cvoid my_log_callback(void *pArg, int iErrCode, const char*zFormat, ...){自定义处理日志信息的代码}然后,通过调用sqlite3_config函数来注册该回调函数:csqlite3_config(SQLITE_CONFIG_LOG, my_log_callback, pArg);其中,my_log_callback是自定义的回调函数,pArg是一些额外的参数,可以在回调函数中使用。
SQLite3 案例讲解
SQLite3实验指导书——2015版实验1 SQLite使用基础数据类型NULL: 表示该值为NULL值。
INTEGER: 无符号整型值。
REAL: 浮点值。
TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。
BLOB: 存储Blob数据,该类型数据和输入数据完全相同,1表示true,0表示false。
SQLite 数据库常用约束如下:∙NOT NULL - 非空∙UNIQUE - 唯一∙PRIMARY KEY - 主键∙FOREIGN KEY - 外键∙CHECK - 条件检查∙DEFAULT - 默认主键一般是整数或者字符串,只要保证唯一就行。
在 SQLite 中,主键如果是整数类型,该列的值可以自动增长。
默认值 DEFAULT有一些特别的字段列,在每一条记录中,他的值基本上都是一样的。
只是在个别情况下才改为别的值,这样的字段列我们可以给他设一个默认值。
非空 NOT NULL有一些字段我们可能一时不知到该填些什么,同时它也没设定默认值,当添加数据时,我们把这样的字段空着不填,系统认为他是 NULL 值。
但是还有另外一类字段,必须被填上数据,如果不填,系统就会报错。
这样的字段被称为 NOT NULL 非空字段,需要在定义表的时候事先声明。
唯一除了主列以为,还有一些列也不能有重复值条件检查 CHECK某些值必须符合一定的条件才允许存入,这是就需要用到这个 CHECK 约束。
CREATE TABLE Teachers(Id integer PRIMARY KEY,Age integer CHECK(Age>22));外键 FOREIGN KEY我们的数据库中已经有 Teachers 表了,假如我们再建立一个 Students 表,要求Students 表中的每一个学生都对应一个 Teachers 表中的教师。
很简单,只需要在 Students 表中建立一个 TeacherId 字段,保存对应教师的 Id 号,这样,学生和教师之间就建立了关系。
玩转SQLite系列SQLite数据库应用案例实现历史搜索记录
玩转SQLite系列SQLite数据库应用案例实现历史搜索记录玩转SQLite系列SQLite数据库应用案例实现历史搜索记录一.编写一个历史搜索记录实例对象package cn.bluemobi.dylan.sqlite;import java.util.Date;/*** 搜索记录的操作对象* Created by Administrator on 2016-11-20.*/public class History {/*** id 主键,自增*/private int id;/*** 搜索的内容*/private String content;/*** 搜索的时间*/private String time;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}}二.编写一个操作数据库的管理工具类package cn.bluemobi.dylan.sqlite;import android.content.ContentValues; import android.database.Cursor;import android.database.sqlite.SQLiteDatabase; import android.os.Environment;import java.io.File;import java.util.ArrayList;import java.util.List;/*** 数据库操作管理类* Created by Administrator on 2016-11-19.*/public class DBManager {private static volatile DBManager dbManager; private SQLiteDatabase sqLiteDatabase; private DBManager() {openDataBase();createTable();}public static DBManager getDBManager() {if (dbManager == null) {synchronized (DBManager.class) {if (dbManager == null) {dbManager = new DBManager();}}}return dbManager;}/*** 数据库名称*/private final String DA TABASE_NAME = "info.db"; /*** 表名*/private final String TABLE_NAME = "history";/*** 表格所包含的字段*/private class HistoryDbColumn {/*** 字段一id*/public static final String ID = "id";/*** 字段二内容*/public static final String CONTENT = "name";/*** 字段三时间*/public static final String TIME = "time";}/*** 1.创建或打开数据库连接**/private void openDataBase() {File dataBaseFile = new File(Environment.getExternalStorageDirectory() + "/sqlite", DA TABASE_NAME);if (!dataBaseFile.getParentFile().exists()) {dataBaseFile.mkdirs();}sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(dataBaseFile, null);}/***** 2.创建表*/private void createTable() {String sql = "CREATE TABLE " +"IF NOT EXISTS " +TABLE_NAME + "(" +HistoryDbColumn.ID + " Integer PRIMARY KEY AUTOINCREMENT," +HistoryDbColumn.CONTENT + " varchar," +HistoryDbColumn.TIME + " datetime)";sqLiteDatabase.execSQL(sql);}/*** 插入一条数据** @param history* @return*/public long insert(History history) {ContentV alues contentValues = new ContentValues();contentValues.put(HistoryDbColumn.CONTENT,history.getContent());contentValues.put(HistoryDbColumn.TIME,history.getTime());long num = sqLiteDatabase.insert(TABLE_NAME, null, contentValues);return num;}/*** 根据id删除一条数据** @param id* @return*/public long delete(int id) {long num = sqLiteDatabase.delete(TABLE_NAME, HistoryDbColumn.ID + "=?", new String[]{String.valueOf(id)});return num;}/*** 根据id修改一条数据** @param id* @return*/public long update(History history, int id) {ContentV alues contentValues = new ContentValues();contentValues.put(HistoryDbColumn.CONTENT,history.getContent());contentValues.put(HistoryDbColumn.TIME,history.getTime());long num = sqLiteDatabase.update(TABLE_NAME, contentValues, HistoryDbColumn.ID + "=?", new String[]{String.valueOf(id)});return num;}/*** 根据id查询一条数据** @param id* @return*/public History qurey(int id) {History history = null;Cursor cursor = sqLiteDatabase.query(TABLE_NAME, null, HistoryDbColumn.ID + "=?", new String[]{String.valueOf(id)}, null, null, null);if (cursor != null) {if (cursor.moveToNext()) {history = new History();history.setId(cursor.getInt(cursor.getColumnIndex(HistoryDb Column.ID)));history.setContent(cursor.getString(cursor.getColumnIndex(Hist oryDbColumn.CONTENT)));history.setTime(cursor.getString(cursor.getColumnIndex(Hist oryDbColumn.TIME)));}}return history;}/*** 根据id查询一条数据* 倒序** @return*/public List queryAll() {List historys = new ArrayList<>();Cursor cursor = sqLiteDatabase.query(TABLE_NAME, null, null, null, null, null, HistoryDbColumn.TIME + " desc");if (cursor != null) {while (cursor.moveToNext()) {History history = new History();history.setId(cursor.getInt(cursor.getColumnIndex(HistoryDb Column.ID)));history.setContent(cursor.getString(cursor.getColumnIndex( HistoryDbColumn.CONTENT)));history.setTime(cursor.getString(cursor.getColumnIndex(Hist oryDbColumn.TIME)));historys.add(history);}}return historys;}/*** 根据内容查询一条数据** @return*/public History queryByContent(String content) {History history = null;Cursor cursor = sqLiteDatabase.query(TABLE_NAME, null, HistoryDbColumn.CONTENT + "=?", new String[]{content}, null, null, null);if (cursor != null) {if (cursor.moveToNext()) {history = new History();history.setId(cursor.getInt(cursor.getColumnIndex(HistoryDb Column.ID)));history.setContent(cursor.getString(cursor.getColumnIndex(Hist oryDbColumn.CONTENT)));history.setTime(cursor.getString(cursor.getColumnIndex(Hist oryDbColumn.TIME)));}}return history;}}三.搜索对话框的布局文件<="" bdsfid="276" p="" xmlns:android="/doc/4d5ff8e1710abb68a9827 1fe910ef12d2af9a92a.html /apk/res/android">android:layout_width="match_parent"android:layout_height="match_parent"android:minHeight="250dp"android:orientation="vertical"><cn.bluemobi.dylan.sqlite.searchview< bdsfid="282" p=""></cn.bluemobi.dylan.sqlite.searchview<>android:id="@+id/sv"android:padding="10dp"android:background="@color/colorPrimaryDark"android:layout_width="match_parent"android:layout_height="wrap_content"><listview< bdsfid="290" p=""></listview<>android:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"><textview< bdsfid="295" p=""></textview<>android:id="@+id/tv"android:layout_gravity="center"android:gravity="center"android:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent"android:text="暂无搜索记录" />四.编写功能代码package cn.bluemobi.dylan.sqlite;import android.app.Dialog;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.Date;import java.util.List;import/doc/4d5ff8e1710abb68a98271fe910ef12d2af9 a92a.html monAdapter;import/doc/4d5ff8e1710abb68a98271fe910ef12d2af9 a92a.html monViewHolder;/*** SQLite应用案例实现搜索记录* Created by Administrator on 2016-11-20.*/public class SearchActivity extends AppCompatActivity implements View.OnClickListener { private EditText et;private ListView lv;private TextView tv;private Dialog dialog;private SearchView sv;private Button bt;private List histories;private CommonAdapter commonAdapter;private final int MAX_ITME = 5;private void assignViews() {et = (EditText) findViewById(R.id.et);}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);getSupportActionBar().setTitle("SQLite应用案例实现搜索记录");setContentView(/doc/4d5ff8e1710abb68a9 8271fe910ef12d2af9a92a.html yout.ac_search);assignViews();intiDialog();addListener();initData();}/*** 添加按钮监听*/private void addListener() {et.setOnClickListener(this);}/**** 初始化搜索对话框*/private void intiDialog() {dialog = new Dialog(this, R.style.Dialog_FullScreen);dialog.setContentView(/doc/4d5ff8e1710a bb68a98271fe910ef12d2af9a92a.html yout.dialog_search);dialog.getWindow().setGravity(Gravity.TOP);dialog.setCanceledOnTouchOutside(true);dialog.setCancelable(true);/doc/4d5ff8e1710abb68a98271fe910ef12d 2af9a92a.html youtParams lp = dialog.getWindow().getAttributes();lp.width = /doc/4d5ff8e1710abb68a98271fe910ef12d2af9 a92a.html youtParams.MATCH_PARENT;lp.height = /doc/4d5ff8e1710abb68a98271fe910ef12d2af9 a92a.html youtParams.WRAP_CONTENT;dialog.getWindow()/doc/4d5ff8e1710abb6 8a98271fe910ef12d2af9a92a.html ttributes(lp);lv = (ListView) dialog.findViewById(R.id.lv);tv = (TextView) dialog.findViewById(/doc/4d5ff8e1710abb68a9 8271fe910ef12d2af9a92a.html );sv = (SearchView) dialog.findViewById(R.id.sv);bt = (Button) dialog.findViewById(R.id.bt);bt.setOnClickListener(this);lv.setEmptyView(tv);}/*** 初始化数据*/private void initData() {commonAdapter = new CommonAdapter(this, histories,/doc/4d5ff8e1710abb68a98271fe910ef12d2af9 a92a.html yout.item_for_search) {@Overrideprotected void convertView(CommonViewHolder commonViewHolder, History history) {TextView tv = commonViewHolder.get(R.id.textView);tv.setText(history.getContent());}};lv.setAdapter(commonAdapter);notifyAdapter();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.et:if (!dialog.isShowing()) {dialog.show();}break;case R.id.bt:addHistory();break;}}/*** 点击搜索按钮新增一条记录*/private void addHistory() {String inputText = sv.getInputText();if (inputText.isEmpty()) {Toast.makeText(this, "请输入内容进行搜索", Toast.LENGTH_SHORT).show();return;}/**1.先判断数据库当中有没有这条历史记录,如果有则修改其搜索的时间即可*/ History history = DBManager.getDBManager().queryByContent(inputT ext);if (history != null) {history.setTime(new Date().toString());DBManager.getDBManager().update(history, history.getId());} else {/**2.判断搜索记录是否达到限值,达到极限则删除一条数据**/if (histories != null && histories.size() == MAX_ITME) {DBManager.getDBManager().delete(histories.get(histories.si ze() - 1).getId());}/**3.插入一条数据**/history = new History();history.setContent(sv.getInputText());history.setTime(new Date().toString());long num = DBManager.getDBManager().insert(history);if (num != -1) {Log.d(Contacts.TAG, "插入成功");} else {Log.d(Contacts.TAG, "插入失败");}}notifyAdapter();}/*** 更新数据库当中的数据*/private void notifyAdapter() {histories = DBManager.getDBManager().queryAll(); commonAdapter.notifyDataSetChanged(histories); }}。
SQL查询日志查看数据库历史查询记录的方法
SQL查询⽇志查看数据库历史查询记录的⽅法好吧,到数据库⽇志中去找找,通过时间、关键字批配。
能想到的全⽤上吧。
⾸先假定你执⾏过它。
没有?好吧,要么它太过简单,要么你太过不简单。
复制代码代码如下:SELECT TOP 1000--创建时间QS.creation_time,--查询语句SUBSTRING(ST.text,(QS.statement_start_offset/2)+1,((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1) AS statement_text,--执⾏⽂本ST.text,--执⾏计划QS.total_worker_time,st_worker_time,QS.max_worker_time,QS.min_worker_timeFROMsys.dm_exec_query_stats QS--关键字CROSS APPLYsys.dm_exec_sql_text(QS.sql_handle) STWHEREQS.creation_time BETWEEN '2011-10-20 16:00:00' AND '2011-10-20 17:00:00'AND ST.text LIKE '%%'ORDER BYQS.creation_time DESC这⾥⽤到了SQL Server 2005 新增的 cross apply 和 outer apply 联接语句,⽤于交叉联接表值函数(返回表结果集的函数),更重要的是这个函数的参数是另⼀个表中的字段。
【SQL Server】CROSS APPLY和OUTER APPLY的应⽤详解。
用SQlite进行全文搜索
对于应用软件开发人员来说,要解决这个问题有许多的方案可以选择。
如,利用MySQL和PostgreSQL或者Sphinx和Lucene这样的独立软件进行本地执行。
然而,这些要么用起来棘手,要么就过度了。
幸运的是,Google为SQLite贡献了一些资源以实现帮助。
在版本3.3.8中第一次实现全文检索。
此版本提供的功能可以创建一个依赖于外部延伸的虚拟表:在这里,全文搜索运算法则可用于任何虚拟表内的文本列。
在PHP 5.3.0中,对应的支持只被默认的PDO和SQLite3激活。
较早版本的PHP可以使用PECL 的SQLite3扩展库。
创建一个搜索索引通常情况如下:•把文本分解成记号。
•转换为小写字母。
•确定根词。
•建立索引。
设置好一切在默认情况下,SQLite提供了两个基本的分词器,Simple和Porter。
它们可以控制字的分开方式。
Simple根据空格和标点符号将文本分解成不同的记号。
Porter是专为英文使用而设计,它可以将大量的文字扩展化解为基础形式。
例如,condolidate,consolidated,和consolidating这一类词语都会被转变成consolid。
遗憾的是,SQLite目前还没有取消停用词。
所以常用词,例如,the,of和to仍位于索引内。
这会极大地扩充索引的范畴并减缓搜索速度。
最简单的解决办法是,在按下确认检索之前手动除去停用词。
下面,向您展示一些代码,教你如何创建自己的第一个全文索引。
SQLite之所以做到这些,是因为它通过使用FTS3扩展建立一个虚拟表。
只有文本列位于这个虚拟表以内时,才可以被搜索,并且最后一列用来识别使用的分词器类型。
CREA TE VIRTUAL TABLE exampleUSING FTS3(title TEXT, TOKENIZE SIMPLE)创建表后,您可以使用SELECT,INSERT,UPDA TE和DELETE语句询问此表。
此处要附加说明的是:没有进一步的索引可以建立在表格上,所以简单的查询将导致对全表的扫描。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
玩转SQLite系列SQLite数据库应用案例实现历史搜索记录一.编写一个历史搜索记录实例对象package cn.bluemobi.dylan.sqlite;import java.util.Date;/*** 搜索记录的操作对象* Created by Administrator on 2016-11-20.*/public class History {/*** id 主键,自增*/private int id;/*** 搜索的内容*/private String content;/*** 搜索的时间*/private String time;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}}二.编写一个操作数据库的管理工具类package cn.bluemobi.dylan.sqlite;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Environment;import java.io.File;import java.util.ArrayList;import java.util.List;/*** 数据库操作管理类* Created by Administrator on 2016-11-19.*/public class DBManager {private static volatile DBManager dbManager;private SQLiteDatabase sqLiteDatabase;private DBManager() {openDataBase();createTable();}public static DBManager getDBManager() {if (dbManager == null) {synchronized (DBManager.class) {if (dbManager == null) {dbManager = new DBManager();}}}return dbManager;}/*** 数据库名称*/private final String DA TABASE_NAME = "info.db";/*** 表名*/private final String TABLE_NAME = "history";/*** 表格所包含的字段*/private class HistoryDbColumn {/*** 字段一id*/public static final String ID = "id";/*** 字段二内容*/public static final String CONTENT = "name";/*** 字段三时间*/public static final String TIME = "time";}/*** 1.创建或打开数据库连接**/private void openDataBase() {File dataBaseFile = new File(Environment.getExternalStorageDirectory() + "/sqlite", DA TABASE_NAME);if (!dataBaseFile.getParentFile().exists()) {dataBaseFile.mkdirs();}sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(dataBaseFile, null);}/***** 2.创建表*/private void createTable() {String sql = "CREATE TABLE " +"IF NOT EXISTS " +TABLE_NAME + "(" +HistoryDbColumn.ID + " Integer PRIMARY KEY AUTOINCREMENT," +HistoryDbColumn.CONTENT + " varchar," +HistoryDbColumn.TIME + " datetime)";sqLiteDatabase.execSQL(sql);}/*** 插入一条数据** @param history* @return*/public long insert(History history) {ContentV alues contentValues = new ContentValues();contentValues.put(HistoryDbColumn.CONTENT, history.getContent());contentValues.put(HistoryDbColumn.TIME, history.getTime());long num = sqLiteDatabase.insert(TABLE_NAME, null, contentValues);return num;}/*** 根据id删除一条数据** @param id* @return*/public long delete(int id) {long num = sqLiteDatabase.delete(TABLE_NAME, HistoryDbColumn.ID + "=?", new String[]{String.valueOf(id)});return num;}/*** 根据id修改一条数据** @param id* @return*/public long update(History history, int id) {ContentV alues contentValues = new ContentValues();contentValues.put(HistoryDbColumn.CONTENT, history.getContent());contentValues.put(HistoryDbColumn.TIME, history.getTime());long num = sqLiteDatabase.update(TABLE_NAME, contentValues, HistoryDbColumn.ID + "=?", new String[]{String.valueOf(id)});return num;}/*** 根据id查询一条数据** @param id* @return*/public History qurey(int id) {History history = null;Cursor cursor = sqLiteDatabase.query(TABLE_NAME, null, HistoryDbColumn.ID + "=?", new String[]{String.valueOf(id)}, null, null, null);if (cursor != null) {if (cursor.moveToNext()) {history = new History();history.setId(cursor.getInt(cursor.getColumnIndex(HistoryDbColumn.ID))); history.setContent(cursor.getString(cursor.getColumnIndex(HistoryDbColumn.CONTENT)));history.setTime(cursor.getString(cursor.getColumnIndex(HistoryDbColumn.TIME)));}}return history;}/*** 根据id查询一条数据* 倒序** @return*/public List<History> queryAll() {List<History> historys = new ArrayList<>();Cursor cursor = sqLiteDatabase.query(TABLE_NAME, null, null, null, null, null, HistoryDbColumn.TIME + " desc");if (cursor != null) {while (cursor.moveToNext()) {History history = new History();history.setId(cursor.getInt(cursor.getColumnIndex(HistoryDbColumn.ID)));history.setContent(cursor.getString(cursor.getColumnIndex(HistoryDbColumn.CONTENT)));history.setTime(cursor.getString(cursor.getColumnIndex(HistoryDbColumn.TIME)));historys.add(history);}}return historys;}/*** 根据内容查询一条数据** @return*/public History queryByContent(String content) {History history = null;Cursor cursor = sqLiteDatabase.query(TABLE_NAME, null, HistoryDbColumn.CONTENT + "=?", new String[]{content}, null, null, null);if (cursor != null) {if (cursor.moveToNext()) {history = new History();history.setId(cursor.getInt(cursor.getColumnIndex(HistoryDbColumn.ID))); history.setContent(cursor.getString(cursor.getColumnIndex(HistoryDbColumn.CONTENT)));history.setTime(cursor.getString(cursor.getColumnIndex(HistoryDbColumn.TIME)));}}return history;}}三.搜索对话框的布局文件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:minHeight="250dp"android:orientation="vertical"><cn.bluemobi.dylan.sqlite.SearchViewandroid:id="@+id/sv"android:padding="10dp"android:background="@color/colorPrimaryDark"android:layout_width="match_parent"android:layout_height="wrap_content"></cn.bluemobi.dylan.sqlite.SearchView><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView><TextViewandroid:id="@+id/tv"android:layout_gravity="center"android:gravity="center"android:layout_weight="1"android:layout_width="match_parent"android:layout_height="match_parent"android:text="暂无搜索记录" /></LinearLayout>四.编写功能代码package cn.bluemobi.dylan.sqlite;import android.app.Dialog;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.Date;import java.util.List;import monAdapter;import monViewHolder;/*** SQLite应用案例实现搜索记录* Created by Administrator on 2016-11-20.*/public class SearchActivity extends AppCompatActivity implements View.OnClickListener { private EditText et;private ListView lv;private TextView tv;private Dialog dialog;private SearchView sv;private Button bt;private List<History> histories;private CommonAdapter<History> commonAdapter;private final int MAX_ITME = 5;private void assignViews() {et = (EditText) findViewById(R.id.et);}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);getSupportActionBar().setTitle("SQLite应用案例实现搜索记录");setContentView(yout.ac_search);assignViews();intiDialog();addListener();initData();}/*** 添加按钮监听*/private void addListener() {et.setOnClickListener(this);}/**** 初始化搜索对话框*/private void intiDialog() {dialog = new Dialog(this, R.style.Dialog_FullScreen);dialog.setContentView(yout.dialog_search);dialog.getWindow().setGravity(Gravity.TOP);dialog.setCanceledOnTouchOutside(true);dialog.setCancelable(true);youtParams lp = dialog.getWindow().getAttributes();lp.width = youtParams.MATCH_PARENT;lp.height = youtParams.WRAP_CONTENT;dialog.getWindow()ttributes(lp);lv = (ListView) dialog.findViewById(R.id.lv);tv = (TextView) dialog.findViewById();sv = (SearchView) dialog.findViewById(R.id.sv);bt = (Button) dialog.findViewById(R.id.bt);bt.setOnClickListener(this);lv.setEmptyView(tv);}/*** 初始化数据*/private void initData() {commonAdapter = new CommonAdapter<History>(this, histories, yout.item_for_search) {@Overrideprotected void convertView(CommonViewHolder commonViewHolder, History history) {TextView tv = commonViewHolder.get(R.id.textView);tv.setText(history.getContent());}};lv.setAdapter(commonAdapter);notifyAdapter();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.et:if (!dialog.isShowing()) {dialog.show();}break;case R.id.bt:addHistory();break;}}/*** 点击搜索按钮新增一条记录*/private void addHistory() {String inputText = sv.getInputText();if (inputText.isEmpty()) {Toast.makeText(this, "请输入内容进行搜索", Toast.LENGTH_SHORT).show();return;}/**1.先判断数据库当中有没有这条历史记录,如果有则修改其搜索的时间即可*/ History history = DBManager.getDBManager().queryByContent(inputText);if (history != null) {history.setTime(new Date().toString());DBManager.getDBManager().update(history, history.getId());} else {/**2.判断搜索记录是否达到限值,达到极限则删除一条数据**/if (histories != null && histories.size() == MAX_ITME) {DBManager.getDBManager().delete(histories.get(histories.size() - 1).getId());}/**3.插入一条数据**/history = new History();history.setContent(sv.getInputText());history.setTime(new Date().toString());long num = DBManager.getDBManager().insert(history);if (num != -1) {Log.d(Contacts.TAG, "插入成功");} else {Log.d(Contacts.TAG, "插入失败");}}notifyAdapter();}/*** 更新数据库当中的数据*/private void notifyAdapter() {histories = DBManager.getDBManager().queryAll();commonAdapter.notifyDataSetChanged(histories);}}。