Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解
SQLite数据库简介、特点、优势、局限性及使用
SQLite数据库简介、特点、优势、局限性及使⽤SQLite简介SQLite是⼀个进程内的轻量级嵌⼊式数据库,它的数据库就是⼀个⽂件,实现了⾃给⾃⾜、⽆服务器、零配置的、事务性的SQL数据库引擎。
它是⼀个零配置的数据库,这就体现出来SQLite与其他数据库的最⼤的区别:SQLite不需要在系统中配置,直接可以使⽤。
且SQLite不是⼀个独⽴的进程,可以按应⽤程序需求进⾏静态或动态连接。
SQLite可直接访问其存储⽂件。
SQLite对于其他数据库有什么优势:不需要配置,不需要安装和管理不需要⼀个单独的服务器进程或操作的系统(⽆服务器的)⼀个完整的SQLite数据库存储在⼀个单⼀的跨平台的磁盘⽂件上SQLite是⾮常⼩的,轻量级的数据库,完全配置时⼩于400,省略可选功能配置时⼩于250SQLite是⼀个⾃给⾃⾜的数据库,这也就意味着不需要任何外部的依赖SQLite事务是完全兼容的,允许从多个进程或线程安全访问SQLite⽀持SQL92(SQL2)标准的⼤多数查询语⾔的功能SQLite使⽤ANSI-C编写的,并提供了简单和易于使⽤的APISQLite可在UINX(Linux,Max OS-X,Android,iOS)和Windows(Win32,WinCE,WinRT)中运⾏SQLite的局限性:在SQLite中,SQL92不⽀持的特性如下所⽰:RIGHT OUTER JOIN: 只实现了LEFT OUTER JOINFULL OUTER JOIN: 只实现了LEFT OUTER JOINALTER TABLE: ⽀持RENAME TABLE和ALTER TABLE的ADD COLUMN variants命令,不⽀持DROP COLUMN、ALTER COLUMN、ADD CONSTRAINTTrigger⽀持:⽀持FOR EACH ROW触发器,但不⽀持FOR EACH STATEMENT触发器VIEWS: 在SQLite中,视图是只读的,不能在视图中执⾏DELETE、INSERT或UPDATE语句GRANT 和 REVOKE:可以应⽤的唯⼀的访问权限是底层操作系统的正常⽂件访问权限SQLite命令与关系数据库进⾏交互的标准SQLite命令类似于SQL。
SQLite的介绍操作Sqlite具体实例
SQLite的介绍操作Sqlite具体实例1.SQLite简介SQLite是⼀款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计⽬标是嵌⼊式的,⽽且⽬前已经在很多嵌⼊式产品中使⽤了它,它占⽤资源⾮常的低,在嵌⼊式设备中,可能只需要⼏百K的内存就够了。
它能够⽀持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语⾔相结合,⽐如Tcl、PHP、Java、C++、.Net等,还有ODBC接⼝,同样⽐起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度⽐他们都快。
2.SQLite的特点:轻量级SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。
使⽤SQLite⼀般只需要带上它的⼀个动态库,就可以享受它的全部功能。
⽽且那个动态库的尺⼨也挺⼩,以版本3.6.11为例,Windows下487KB、Linux下347KB。
不需要"安装"SQLite的核⼼引擎本⾝不依赖第三⽅的软件,使⽤它也不需要"安装"。
有点类似那种绿⾊软件。
单⼀⽂件数据库中所有的信息(⽐如表、视图等)都包含在⼀个⽂件内。
这个⽂件可以⾃由复制到其它⽬录或其它机器上。
跨平台/可移植性除了主流操作系统 windows,linux之后,SQLite还⽀持其它⼀些不常⽤的操作系统。
弱类型的字段同⼀列中的数据可以是不同类型开源3.SQLite数据类型⼀般数据采⽤的固定的静态数据类型,⽽SQLite采⽤的是动态数据类型,会根据存⼊值⾃动判断。
SQLite具有以下五种常⽤的数据类型:NULL: 这个值为空值VARCHAR(n):长度不固定且其最⼤长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的⼤⼩可以依次被存储为1,2,3,4,5,6,7,8.REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.TEXT: 值为⽂本字符串,使⽤数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).BLOB: 值是BLOB数据块,以输⼊的数据格式进⾏存储。
sqlite 用法
sqlite 用法SQLite是一种轻型关系型数据库管理系统,它是一个C语言库,实现了自给自足、无服务器、零配置、事务性的SQL数据库引擎。
SQLite不需要单独的服务器进程或操作系统支持,这使它成为嵌入式数据库的理想选择,也适用于客户端/服务器的数据库应用程序。
SQLite的文件格式跨平台,可以在不同的操作系统中共享。
SQLite 的应用非常广泛,包括Android、iOS、Windows、Linux等系统中的各种应用程序和网站。
SQLite的使用非常简单,只需要引入SQLite的头文件,然后使用相应的API即可实现数据库的连接、数据的插入、查询、更新和删除等操作。
SQLite的API包含在sqlite3.h头文件中,其中最常用的API包括:sqlite3_open()用于连接数据库,sqlite3_exec()用于执行SQL语句,sqlite3_prepare_v2()用于准备SQL语句,sqlite3_step()用于执行SQL语句的下一步,sqlite3_finalize()用于释放已准备好的SQL语句,sqlite3_close()用于关闭数据库连接等。
在SQLite中,数据存储在表中,每个表由一组列组成。
表的创建可以使用SQL语句CREATE TABLE,格式为:CREATE TABLE 表名 (列1名列1类型, 列2名列2类型, …) 例如:CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)这个语句创建了一个名为“user”的表,包含三列:id、name和age。
其中,id列为主键,类型为INTEGER,name列和age列分别为TEXT和INTEGER类型。
表的数据可以通过INSERT INTO语句进行插入,例如:INSERT INTO user (name, age) VALUES ('Tom', 20) 这个语句向user表中插入了一条记录,name列的值为“Tom”,age列的值为20。
安卓sqlite常用语句
SQLite 是Android 平台上的默认数据库管理系统,用于存储和检索数据。
以下是一些常用的SQLite 语句和操作:1. 创建数据库:sqlCREATE DATABASE [database_name];2. 打开数据库:如果你想在特定数据库上执行操作,你需要先打开它。
sqlATTACH DATABASE [database_name] AS [database_alias];3. 创建表:sqlCREATE TABLE [table_name] ([column1] [data_type],[column2] [data_type],...);4. 插入数据:sqlINSERT INTO [table_name] ([column1], [column2], ...)VALUES ([value1], [value2], ...);5. 查询数据:sqlSELECT FROM [table_name]; -- 选择所有列SELECT [column1], [column2] FROM [table_name]; -- 选择特定列6. 更新数据:sqlUPDATE [table_name]SET [column1] = [value1], [column2] = [value2], ...WHERE [condition];7. 删除数据:sqlDELETE FROM [table_name] WHERE [condition];8. 创建索引:创建索引可以加速查询速度。
sqlCREATE INDEX [index_name] ON [table_name] ([column1], [column2], ...);9. 创建触发器:触发器是与特定表相关联的特殊类型的存储过程,它自动执行特定操作。
例如,当向表中插入、更新或删除记录时,触发器可以自动执行。
10. 创建视图:视图是基于一个或多个表的虚拟表。
学习使用SQLite进行数据库开发
学习使用SQLite进行数据库开发第一章:SQLite和数据库开发简介数据库是指存储、管理和维护大量结构化数据的系统。
它能够提供数据的可靠性、一致性、并发控制和数据安全等功能。
SQLite是一款轻量级的嵌入式数据库,它是以C语言编写的,具有小巧、高效和可靠的特点。
本章将对SQLite和数据库开发的基本概念进行介绍。
1.1 SQLite简介SQLite是一种关系型数据库管理系统,使用嵌入式SQL语句进行数据库操作。
相比于其他数据库管理系统,SQLite的特点是体积小、运行速度快、跨平台性强,并且不需要独立的服务器进程,数据库以一个文件的形式存储在本地磁盘上。
1.2 数据库开发基础概念数据库开发需要掌握的基础概念包括数据库、表、字段、主键、外键和索引等。
数据库是一个总体的概念,由多个表组成;表是数据库中的一种结构,由多个字段组成;字段是表中的一列,用于存储不同类型的数据;主键是唯一区分表中记录的字段;外键是表与表之间的关系建立的依据;索引是提高查询效率的数据结构。
第二章:SQLite的安装和使用本章将介绍如何下载、安装和配置SQLite,以及使用SQLite 进行数据库操作的基本命令和语法。
2.1 SQLite的安装SQLite的安装非常简便,只需下载对应操作系统的SQLite二进制文件或者使用包管理工具进行安装即可。
2.2 SQLite的配置SQLite不需要独立的服务器进程,整个数据库就是一个文件。
在配置方面,可以通过设置SQLITE_HOME环境变量来指定SQLite的安装路径。
此外,还可以通过配置文件SQLite.conf对数据库的参数进行调整。
2.3 SQLite的基本命令SQLite提供了一系列的命令行工具,用于创建、管理和查询数据库。
常用的命令包括打开数据库、创建表、插入数据、查询数据和删除表等。
第三章:数据库的建模与设计数据库的建模和设计是数据驱动应用程序开发的基础。
本章将介绍常用的数据库建模工具和方法,以及如何设计规范化的数据库结构。
android中SQLite的使用总结,用excSQL和rawQuery方法实现一般得增删改查
android中SQLite的使用总结,用excSQL和rawQuery方法实现一般得增删改查1:androidmanifest.xml的内容[html]view plaincopy1.<?xml version="1.0" encoding="utf-8"?>2.<manifest xmlns:android="/apk/res/android"3.package="cn.itcast.db"4.android:versionCode="1"5.android:versionName="1.0">6.<application android:icon="@drawable/icon" android:lab el="@string/app_name">7.<uses-library android:name="android.test.runner" />8.<activity android:name=".MainActivity"9.android:label="@string/app_name">10.<intent-filter>11.<action android:name="android.intent.action.MAIN" / >12.<category android:name=" UNCHER" />13.</intent-filter>14.</activity>15.16.</application>17.18.<uses-sdk android:minSdkVersion="8" />19.<!-- 配置测试环境 -->20.<instrumentation android:name="android.test.Instru mentationTestRunner"21.android:targetPackage="cn.itcast.db"22.android:label="T est for My App"/>23.24.</manifest>2:Person类[java]view plaincopy1.package cn.itcast.domain;2.3.public class Person {4.5.private Integer id;6.private String name;7.8.public Person() {9.10.}11.12.public Integer getId() {13.return id;14.}15.16.public void setId(Integer id) {17.this.id = id;18.}19.20.public String getName() {21.return name;22.}23.24.public void setName(String name) { = name;26.}27.28.@Override29.public String toString() {30.return "Person [id=" + id + ", name=" + name + "]";31.}32.33.}3:DBOpenHelper类,该类继承了SQLiteOpenHelper类[java]view plaincopy1.package cn.itcast.service;2.3.import android.content.Context;4.import android.database.sqlite.SQLiteDatabase;5.import android.database.sqlite.SQLiteOpenHelper;6.import android.database.sqlite.SQLiteDatabase.CursorFac tory;7.8.public class DBOpenHelper extends SQLiteOpenHelper {9.10.private static final String DATABASENAME = "cn.itcast. db";11.private static final int DATABASEVERSION = 1;12.13./*14.* 构造函数15.*/16.public DBOpenHelper(Context context) {17.super(context, DATABASENAME, null, DATABASEVERSION);18.}19.20./*21.* 数据库第一次生成时调用该方法,创建一些表或者初始化一些数据22.* @see android.database.sqlite.SQLiteOpenHelper#on Create(android.database.sqlite.SQLiteDatabase)23.*/24.@Override25.public void onCreate(SQLiteDatabase db) {26.db.execSQL("create table person(personid integer pri mary key autoincrement, name varchar(20))");27.}28.29.@Override30.public void onUpgrade(SQLiteDatabase db, int oldVer sion, int newVersion) {31.32.}33.34.}4:PersonService类[java]view plaincopy1.package cn.itcast.service;2.3.import java.util.ArrayList;4.import java.util.List;5.6.import android.content.Context;7.import android.database.Cursor;8.import android.database.sqlite.SQLiteDatabase;9.import cn.itcast.domain.Person;10.11.public class PersonService {12.13.private DBOpenHelper dbOpenHelper;14.15.public PersonService(Context context) {16.this.dbOpenHelper = new DBOpenHelper(context);17.}18.19./*20.* save a person to the database21.*/22.public void save(Person person) {23.SQLiteDatabase database = dbOpenHelper.getWritabl eDatabase();24.database.execSQL("insert into person(name) values (?) ", new Object[]{person.getName()});25.}26.27./*28.* updata a person to the database29.*/30.public void update(Person person) {31.SQLiteDatabase database = dbOpenHelper.getWritabl eDatabase();32.database.execSQL("update person set name=? wherepersonid=?", new Object[]{person.getName(), person.getId()});33.}34.35./*36.* delete a person from the database according to the id37.*/38.public void delete(Integer id) {39.SQLiteDatabase database = dbOpenHelper.getWritabl eDatabase();40.database.execSQL("delete from person where personi d=?", new Object[]{id.toString()});41.}42.43./*44.* find a person from the database according to the id45.*/46.public Person find(Integer id) {47.SQLiteDatabase database = dbOpenHelper.getReadab leDatabase();48.Cursor cursor = database.rawQuery("select * from per son where personid=?", new String[]{id.toString()});49.Person person = null;50.if(cursor.moveT oFirst()) {51.Integer personid = cursor.getInt(cursor.getColumnInd ex("personid"));52.String name = cursor.getString(cursor.getColumnIndex ("name"));53.person = new Person();54.person.setId(personid);56.}57.return person;58.}59.60./*61.* get the data of person accroding to the offset and m axResult62.*/63.public List<Person> getScrollData(Integer offset, Integ er maxResult) {64.SQLiteDatabase database = dbOpenHelper.getReadab leDatabase();65.Cursor cursor = database.rawQuery("select * from per son limit ?,?", new String[] {offset.toString(), maxResult.toString() });66.int idIndex = 0;67.int nameIndex = 0;68.List<Person> personList = null;69.70.if(cursor.getCount() >= 0) {71.idIndex = cursor.getColumnIndex("personid");Index = cursor.getColumnIndex("name");73.personList = new ArrayList<Person>();74.}75.76.while(cursor.moveToNext()) {77.Integer personid = cursor.getInt(idIndex);78.String name = cursor.getString(nameIndex);79.Person person = new Person();81.person.setName(name);82.personList.add(person);83.}84.return personList;85.}86.87./*88.* get the count of the database89.*/90.public long getCount(){91.SQLiteDatabase database = dbOpenHelper.getReadab leDatabase();92.Cursor cursor = database.rawQuery("select count(*) fr om person", null);93.cursor.moveToFirst();94.return cursor.getLong(0);95.}96.97.}5:PersonServiceT est类[java]view plaincopy1.package cn.itcast.db;2.3.import java.util.List;4.5.import android.test.AndroidTestCase;6.import android.util.Log;7.import cn.itcast.domain.Person;8.import cn.itcast.service.DBOpenHelper;9.import cn.itcast.service.PersonService;10.11.public class PersonServiceTest extends AndroidT estCase {12.private static final String TAG = "PersonServiceTest";13.14./*15.* 测试生成数据库的方法16.*/17.public void testCreateDB() throws Throwable {18.DBOpenHelper dbOpenHelper = new DBOpenHelper( this.getContext());19.dbOpenHelper.getWritableDatabase(); //第一次调用该方法会生成数据库20.21.}22.23./*24.* 测试保存方法25.*/26.public void testSave() throws Throwable{27.PersonService personService = new PersonService(this .getContext());28.29.Person person1 = new Person();30.person1.setName("zhangsan");31.personService.save(person1);32.33.Person person2 = new Person();34.person2.setName("lisi");35.personService.save(person2);36.37.Person person3 = new Person();38.person3.setName("wangwu");39.personService.save(person3);40.41.}42.43.public void testDelete() {44.PersonService personService = new PersonService(this .getContext());45.personService.delete(1);46.47.}48.49./*50.* 测试更新方法51.*/52.public void testUpdate() {53.PersonService personService = new PersonService(this .getContext());54.Person person = personService.find(1);55.person.setName("zhaoliu");56.personService.update(person);57.58.}59.60./*61.* 测试获得数据方法63.public void testGetScrollData() throws Throwable{64.PersonService personService = new PersonService(this .getContext());65.List<Person> persons = personService.getScrollData(0 , 3);66.for(Person person : persons) {67.Log.i(TAG, person.toString());68.}69.}70.71./*72.* 测试根据id查找的方法73.*/74.public void testFind() throws Throwable{75.PersonService personService = new PersonService(this .getContext());76.Person person = personService.find(1);77.Log.i(TAG, person.toString());78.79.}80.81./*82.* 测试获得数量的方法83.*/84.public void testGetCount() {85.PersonService personService = new PersonService(this .getContext());86.long count = personService.getCount();87.Log.i(TAG, count + "");89.}。
sqlite教程
sqlite教程SQLite是一种轻型的嵌入式数据库引擎,它是开源的,跨平台的,被广泛用于嵌入式设备、移动应用以及小型数据库应用。
SQLite具有简单、易于使用、高效、可扩展性强等特点,因此备受开发者的喜爱。
本文将为您介绍SQLite的基本概念、常用操作以及一些高级用法。
一、SQLite基本概念1. 数据库文件:SQLite的数据存储在一个普通的磁盘文件中,这个文件是一个可随意命名的。
一个数据库文件可以包含多个表,每个表又可以有多个字段。
2.表:表是数据库中的一个基本结构,它由行和列组成。
每个表由一个唯一的名称标识。
3.字段(列):表中的每一列称为一个字段,它定义了数据的类型和其他属性。
4.记录(行):表中的每一行称为一条记录,它包含了一组字段的值。
二、SQLite常用操作1.创建数据库和表要使用SQLite,首先需要创建一个数据库文件,可以使用以下命令:```bash```这会创建一个名为test.db的数据库文件。
接下来,可以通过CREATE TABLE语句创建表:```sqlCREATE TABLE studentsid INTEGER PRIMARY KEY,name TEXT,age INTEGER```这个语句创建了一个名为students的表,包含了id、name和age三个字段。
2.插入数据插入数据可以使用INSERTINTO语句:```sqlINSERT INTO students (name, age) VALUES ('小明', 18);INSERT INTO students (name, age) VALUES ('小红', 20);```这个语句将分别插入两条数据到students表中。
3.查询数据查询数据可以使用SELECT语句:```sqlSELECT * FROM students;```这个语句将返回students表中的所有记录。
Android学习之SQLite数据库存储
Android 学习之SQLite 数据库存储•引⾔概念 SQLite 数据库,和其他的SQL 数据库不同, 我们并不需要在⼿机上另外安装⼀个数据库软件,Android 系统已经集成了这个数据库;特点SQLite 是⼀个轻量级的关系型数据库,运算速度快,占⽤资源少,很适合在移动设备上使⽤不仅⽀持标准SQL 语法,还遵循ACID(数据库事务)原则,⽆需账号,使⽤起来⾮常⽅便SQLite ⽀持五种数据类型NULLinteger (整型)real(浮点型)text(⽂本类型)blob(⼆进制类型)SQLite 通过⽂件来保存数据库⼀个⽂件就是⼀个数据库数据库中⼜包含多个表格表格⾥⼜有多条记录每条记录由多个字段构成每个字段都有对应的值•创建数据库 Android 为了让我们能够更加⽅便地管理数据库,专门提供了⼀个 SQLiteOpenHelper 帮助类; 借助这个类就可以⾮常简单地对数据库进⾏创建和升级。
SQLiteOpenHelper 是⼀个抽象类,这意味着如果我们想要使⽤它的话,就需要创建⼀个⾃⼰的帮助类去继承它; SQLiteOpenHelper 中有两个抽象⽅法,分别是 和 ;: 数据库第⼀次被创建时被调⽤: 在数据库的版本发⽣变化时会被调⽤⼀般在软件升级时才需改变版本号,⽽数据库的版本是由程序员控制的假设数据库现在的版本是 1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新⽤户⼿机⾥的数据库表结构为了实现这⼀⽬的,可以把原来的数据库版本设置为 2,或者其他与旧版本号不同的数字即可 我们必须在⾃⼰的帮助类⾥⾯重写这两个⽅法,然后分别在这两个⽅法中去实现 创建、升级数据库 的逻辑。
SQLiteOpenHelper 中还有两个⾮常重要的实例⽅法: 和 。
这两个⽅法都可以 创建或打开 ⼀个现有的数据库(如果数据库已存在则直接打开,否则创建⼀个新的数据库), 并返回⼀个可对数据库进⾏读写操作的对象。
在Android应用中利用SQLite进行本地数据库操作
在Android应用中利用SQLite进行本地数据库操作随着移动应用的不断发展,电子设备成为人们生活中不可或缺的一部分。
而Android操作系统作为最广泛使用的移动操作系统之一,它提供了强大的开发平台,为开发者们提供了各种各样的开发工具和API。
其中,SQLite作为Android应用中的一种轻量级数据库管理系统,被广泛应用于数据存储和管理。
本文将介绍在Android应用中通过SQLite实现本地数据库操作的方法。
1. 简介SQLite是一种无服务器的自包含的数据库引擎,它在Android操作系统中作为默认的关系型数据库引擎。
它无需独立的服务器进程,将数据库引擎与应用程序合并在一起,使得应用程序可以直接操作数据库。
SQLite在移动设备上非常流行,因为它占用的磁盘空间相对较少,并且提供了性能高效的操作方式。
2. 创建数据库在Android应用中使用SQLite进行本地数据库操作,首先需要创建一个数据库。
Android提供了SQLiteOpenHelper类来管理数据库的创建和升级。
在创建数据库之前,首先需要定义数据库的结构,包括表的结构和字段信息。
接着,通过继承SQLiteOpenHelper类,重写onCreate()方法和onUpgrade()方法,可以自动创建数据库和升级数据库。
3. 创建表使用SQLite进行本地数据库操作时,需要在数据库中创建表来存储数据。
通过执行SQL语句,可以在数据库中创建表以及定义表中的字段信息。
SQLite支持多种数据类型,包括整型、浮点型、文本型等。
通过在SQL语句中指定字段的名称和类型,可以创建适合应用需求的表。
4. 插入数据插入数据是在数据库中进行本地数据库操作的常见操作之一。
通过执行SQL 语句的INSERT INTO语句,可以将数据插入到数据库的表中。
通过使用ContentValues类,可以方便地设置插入数据的字段值。
通过调用SQLiteDatabase 类的insert()方法,可以执行插入数据的操作。
android sqlite query方法
android sqlite query方法在Android开发中,使用SQLite数据库进行查询是一个常见的操作。
下面是一个简单的例子,展示如何在Android中执行一个SQLite查询:1. 创建数据库助手类:首先,你需要创建一个帮助类来管理你的数据库。
这个类通常会包含创建数据库、打开数据库和执行查询的方法。
2. 定义表格:在数据库中定义一个表格。
例如,你可以创建一个名为`Users`的表格,其中包含`id`, `name`, 和`age`字段。
3. 执行查询:使用`SQLiteDatabase`的`query`方法来执行查询。
这个方法需要指定表名、列名、筛选条件等。
4. 处理结果:查询结果通常会返回一个`Cursor`对象。
你可以遍历这个对象来获取查询到的数据。
下面是一个示例代码,展示如何在Android中执行一个简单的SQLite查询:```javaimport ;import ;import ;import ;import ;public class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "";private static final int DATABASE_VERSION = 1;private static final String TABLE_NAME = "Users";private static final String COLUMN_ID = "id";private static final String COLUMN_NAME = "name";private static final String COLUMN_AGE = "age";private static final String COLUMN_CREATED_AT = "created_at";public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION); }Overridepublic void onCreate(SQLiteDatabase db) {String createTableQuery = "CREATE TABLE " + TABLE_NAME + " (" +COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +COLUMN_NAME + " TEXT, " +COLUMN_AGE + " INTEGER, " +COLUMN_CREATED_AT + " DATETIME DEFAULT CURRENT_TIMESTAMP" +");";(createTableQuery);}Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {("DROP TABLE IF EXISTS " + TABLE_NAME);onCreate(db);}public void addUser(String name, int age) {SQLiteDatabase db = ();ContentValues contentValues = new ContentValues();(COLUMN_NAME, name);(COLUMN_AGE, age);(TABLE_NAME, null, contentValues);();}public Cursor getUsers() {SQLiteDatabase db = ();String selectQuery = "SELECT FROM " + TABLE_NAME;Cursor cursor = (TABLE_NAME, null, null, null, null, null, null); return cursor;}}```在上面的代码中,我们定义了一个`DatabaseHelper`类,它包含了创建数据库、添加用户和查询用户的方法。
sqllite使用说明
sqllite使用说明SQLite是一种轻量级的关系型数据库管理系统,它被广泛应用于移动设备、嵌入式系统以及小型应用程序中。
下面我将从安装、创建数据库、创建表、插入数据、查询数据和更新数据等方面为你介绍SQLite的使用说明。
首先,要使用SQLite,你需要安装SQLite的数据库引擎。
SQLite数据库引擎是一个独立的C库,可以通过官方网站或者其他渠道下载安装。
安装完成后,你就可以开始创建和管理SQLite数据库了。
接下来是创建数据库。
你可以使用命令行工具或者SQLite的客户端应用程序来创建数据库。
在命令行中,你可以通过输入命令"sqlite3 yourdatabasename.db"来创建一个名为yourdatabasename.db的数据库文件。
在客户端应用程序中,一般会有相应的界面操作来创建数据库。
创建数据库后,你可以开始创建表。
使用SQL语句来创建表,例如,"CREATE TABLE tablename (column1 datatype, column2 datatype, column3 datatype, ...);"。
这样就可以创建一个名为tablename的表,并定义了列名和数据类型。
接着是插入数据。
使用SQL语句"INSERT INTO tablename (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);"来向表中插入数据。
这样就可以将指定的数值插入到对应的列中。
然后是查询数据。
使用SQL语句"SELECT column1,column2, ... FROM tablename WHERE condition;"来查询数据。
这样就可以从表中检索出符合条件的数据,并返回指定的列。
最后是更新数据。
使用SQL语句"UPDATE tablename SET column1 = value1, column2 = value2 WHERE condition;"来更新数据。
Android中SQLite使用方法
Android中SQLite使用方法分享一下在Android中如何使用SQLite。
现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧。
对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取。
下面就向大家介绍一下SQLite常用的操作方法,为了方便,我将代码写在了Activity的onCreate中:[java]view plaincopyprint?1.@Override2.protected void onCreate(Bundle savedInstanceState) {3.super.onCreate(savedInstanceState);4.5.//打开或创建test.db数据库6.SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE,null);7.db.execSQL("DROP TABLE IF EXISTS person");8.//创建person表9.db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR, age SMALLINT)");10.Person person = new Person(); = "john";12.person.age = 30;13.//插入数据14.db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", newObject[]{, person.age});15. = "david";17.person.age = 33;18.//ContentValues以键值对的形式存放数据19.ContentValues cv = new ContentValues();20.cv.put("name", );21.cv.put("age", person.age);22.//插入ContentValues中的数据23.db.insert("person", null, cv);24.25.cv = new ContentValues();26.cv.put("age", 35);27.//更新数据28.db.update("person", cv, "name = ?", new String[]{"john"});29.30.Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", newString[]{"33"});31.while (c.moveToNext()) {32.int _id = c.getInt(c.getColumnIndex("_id"));33.String name = c.getString(c.getColumnIndex("name"));34.int age = c.getInt(c.getColumnIndex("age"));35.Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age);36.}37. c.close();38.39.//删除数据40.db.delete("person", "age < ?", new String[]{"35"});41.42.//关闭当前数据库43.db.close();44.45.//删除test.db数据库46.// deleteDatabase("test.db");47.}在执行完上面的代码后,系统就会在/data/data/[PACKAGE_NAME]/databases目录下生成一个“test.db”的数据库文件,如图:上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用[java]view plaincopyprint?1.db.executeSQL(String sql);2.db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集除了统一的形式之外,他们还有各自的操作方法:[java]view plaincopyprint?1.db.insert(String table, String nullColumnHack, ContentValues values);2.db.update(String table, Contentvalues values, String whereClause, StringwhereArgs);3.db.delete(String table, String whereClause, String whereArgs);以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE 表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样。
android:SQLite更新数据
android:SQLite更新数据学习完了如何向表中添加数据,接下来我们看看怎样才能修改表中已有的数据。
SQLiteDatabase 中也是提供了⼀个⾮常好⽤的 update()⽅法⽤于对数据进⾏更新,这个⽅法接收四个参数,第⼀个参数和 insert()⽅法⼀样,也是表名,在这⾥指定去更新哪张表⾥的数据。
第⼆个参数是 ContentValues 对象,要把更新数据在这⾥组装进去。
第三、第四个参数⽤于去约束更新某⼀⾏或某⼏⾏中的数据,不指定的话默认就是更新所有⾏。
那么接下来我们仍然是在 DatabaseTest 项⽬的基础上修改,看⼀下更新数据的具体⽤法。
⽐如说刚才添加到数据库⾥的第⼀本书,由于过了畅销季,卖得不是很⽕了,现在需要通过降低价格的⽅式来吸引更多的顾客,我们应该怎么操作呢?⾸先修改 activity_main.xml 中的代码,如下所⽰:android:layout_width="match_parent" android:layout_height="match_parent"android:orientation="vertical" >……<Button android:id="@+id/update_data" android:layout_width="match_parent" android:layout_height="wrap_content"android:text="Update data"/></LinearLayout>布局⽂件中的代码就已经⾮常简单了,就是添加了⼀个⽤于更新数据的按钮。
然后修改MainActivity 中的代码,如下所⽰:public class MainActivity extends Activity {private MyDatabaseHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main); dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);……Button updateData = (Button) findViewById(R.id.update_data);updateData.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("price", 10.99);db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" });}});}}这⾥在更新数据按钮的点击事件⾥⾯构建了⼀个 ContentValues 对象,并且只给它指定了⼀组数据,说明我们只是想把价格这⼀列的数据更新成 10.99。
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程序设计有所帮助。
关于android studio sqlite数据库实验总结
关于android studio sqlite数据库实验总结作为一个Android Studio的SQLite数据库实验,以下是一些总结:1. 安装SQLite驱动程序:要在Android Studio中使用SQLite,需要安装SQLite驱动程序。
可以使用Android SDK中的工具包安装,具体步骤可以参考SQLite官方文档。
2. 创建SQLite数据库:在Android Studio中创建一个SQLite 数据库,可以在Project--> Database中创建。
在创建数据库时,需要提供一个数据库名称和密码,并设置数据库连接的用户名和密码。
3. 连接SQLite数据库:可以使用Android Studio提供的SQLite 连接工具,在Project--> Database中选择创建的SQLite数据库,然后选择连接工具。
连接时需要提供数据库名称和密码,以及连接服务器的地址和端口号。
4. 创建和保存数据库表:在Android Studio中创建和保存数据库表可以使用SQL语句。
可以使用SQLite的CREATE TABLE语句来创建表,也可以使用INSERT、SELECT等语句来创建、更新和删除表的数据。
5. 操作数据库表:在Android Studio中可以通过SQL语句和Android API来操作数据库表。
可以使用Android Studio提供的SQLite API来执行SELECT、INSERT、UPDATE、DELETE等SQL操作,也可以使用Java API来执行这些操作。
6. 保存和备份数据库:在完成数据库操作后,需要保存和备份数据库。
可以使用Android Studio提供的SQLite连接工具来保存数据库,也可以使用其他工具来备份数据库。
7. 调试数据库操作:在Android Studio中可以通过SQLite连接工具和Android API来调试数据库操作。
Android开发中的数据存储技术研究
Android开发中的数据存储技术研究随着移动互联网和智能手机的普及,人们对于手机应用程序的需求越来越高,要求对手机数据进行高效、安全的存储和管理。
而Android作为最广泛使用的移动操作系统之一,其数据存储技术也成为我们开发人员必须熟练掌握的内容之一。
本文将重点探讨在Android开发中的数据存储技术,希望能够为开发人员提供一些有价值的参考。
一、 SQLite数据库SQLite数据库是一种轻量级的数据库管理系统,应用广泛,包括了操作系统、Web浏览器、工具软件等等。
在Android开发中,SQLite数据库也是常用的数据存储技术。
使用SQLite数据库,我们可以方便地进行本地数据的存储和管理,应用场景很多。
1.1 SQLite的基本概念在使用SQLite数据库之前,我们需要先了解一些基本概念。
下面介绍三个基本概念:表、行、列。
表:SQLite中的表与其他数据库类似,是一种数据结构,用于存储数据。
表由行和列组成,行表示一个条目,列是条目中的一个字段。
行(Record):SQLite中的行与表中的行类似,它是一种数据结构,表示表中的一条纪录。
行的数量表示表中数据的数量。
列(Field):SQLite中的列与表中的列类似,它是一种数据结构,表示表中的一个字段。
列的数量代表了表的属性数量。
1.2 SQLite的使用在Android中使用SQLite通常需要进行以下步骤:1.创建数据库在Android中创建一个SQLite数据库其实就是创建一个SQLiteOpenHelper对象。
在该对象中,我们需要实现其构造函数、onCreate()和onUpgrade()等方法,并在onCreate()方法中创建数据库,数据表和数据默认记录。
2.插入数据在SQLite中插入数据通常需要使用insert()方法,而该方法需要传入数据库名以及一个ContentValues类型的参数,ContentValues是用来存储数据的类。
学会使用SQLite进行轻量级数据库管理
学会使用SQLite进行轻量级数据库管理SQLite是一种轻量级的嵌入式数据库管理系统,它广泛应用于各种移动应用和小型项目中。
学会使用SQLite进行数据库管理,可以帮助开发者有效地存储和管理数据,提高应用程序的性能和稳定性。
本文将围绕SQLite的使用进行详细介绍,包括SQLite的特点、创建数据库、数据表操作、数据操作和性能优化等方面。
第一章:SQLite的特点SQLite具有以下几个显著特点:1. 轻量级:SQLite以静态链接库的形式存在,文件大小仅为几百KB,适合作为移动应用的数据库管理系统。
2. 无需独立服务器:SQLite是嵌入式数据库,不需要独立的数据库服务器,数据库文件即为应用程序的一部分,便于部署和管理。
3. 零配置:SQLite不需要进行繁琐的配置和管理,仅需传递数据库文件路径即可进行访问和操作。
4. 支持多种编程语言:SQLite提供了丰富的API,支持多种编程语言,如C/C++、Java、Python等,方便开发者进行数据库操作。
第二章:创建数据库使用SQLite创建数据库非常简单,只需调用相应的API即可完成。
以下是使用Python在本地创建SQLite数据库的示例代码:```pythonimport sqlite3db = sqlite3.connect('test.db')cursor = db.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')db.close()```以上代码首先使用`connect()`方法连接到test.db数据库文件,然后通过`cursor()`方法创建游标对象,用于执行SQL语句。
接着,调用`execute()`方法执行创建数据表的SQL语句,即创建名为users的数据表,并指定id、name和age三个字段。
SQLite数据库简介和使用
SQLite数据库简介和使⽤⼀、Sqlite简介: SQLite (/),是⼀款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计⽬标是嵌⼊式的,⽽且⽬前已经在很多嵌⼊式产品中使⽤了它,它占⽤资源⾮常的低,在嵌⼊式设备中,可能只需要⼏百K的内存就够了。
它能够⽀持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语⾔相结合,⽐如 Tcl、C#、PHP、Java等,还有ODBC接⼝,同样⽐起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度⽐他们都快。
SQLite第⼀个Alpha版本诞⽣于2000年5⽉.⾄今已经有10个年头,SQLite也迎来了⼀个版本 SQLite 3已经发布。
⼆、Sqlite作者赠⾔: o May you do good and not evil. 愿你⾏善莫⾏恶 o May you find forgiveness for yourself and forgive others. 愿你原谅⾃⼰宽恕他⼈ o May you share freely, never taking more than you give. 愿你宽⼼与⼈分享,所取不多于你所施予三、Sqlite的命令: sqlite3 too.db 创建名为too的数据库,其后缀不⼀定⽤db .Help 求助 .quit 离开四、Sqlite的客户端⼯具: SQLiteExpertPers六、Sqlite的sql语句:建表:create table table_name(field1, field2, field3, ...); 例⼦:创建名为film的数据库表 create table film(_id Integer primaray key autoincrement , title, length, year, starring);注意:语句要以分号结尾,字段不⽤指定类型,它会适时的⾃动转换 可以存储⽂字、数字、⼤⽂本(blub)创建索引:create index index_name on table_name(field_to_be_indexed); 例⼦:针对表film的title字段创建名为film_title_index的索引 create index film_title_index on film(title); 注意:当表的数据较多时,索引能加快查询速度(前提是根据建有索引的字段查询)添加数据:insert into table_name(field1,field2,field3,...) values(data1, data2, data3, ...); 例⼦:向表film中添加⼀条记录 insert into film(title, length, year, starring) values('Contact',153,1997,'Jodie Foster'); 注意:可以省略语句中的字段名部分,前提是数据个数与字段个数⼀样 如果某个字段没有添加值则其值为null,也可⼿动添加null值查询数据:select columns from table_name where expression; 例⼦:从表film中查询数据 1 显⽰表⾥所有字段的所有数据 select * from film; 2 如果资料太多了,我们或许会想限制笔数: select * from film limit 10; 3 照着电影年份来排列: select * from film order by year limit 10; 4 年份⽐较近的电影先列出来: select * from film order by year desc limit 10; 5 我们只想看电影名称跟年份: select title, year from film order by year desc limit 10; 6 查所有茱蒂佛斯特演过的电影: select * from film where starring='Jodie Foster'; 7 查所有演员名字开头叫茱蒂的电影('%' 符号便是 SQL 的万⽤字符): select * from film where starring like 'Jodie%'; 8 查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多⼗笔,只列出电影名称和年份: select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10; 9 查看数据库⼀共有多少条记录: select count(*) from film; 10 查看1985年以后的电影有⼏部: select count(*) from film where year >= 1985;更新数据:update film set starring='Jodie Foster' where starring='Jodee Foster'; 把主⾓字段为'Jodee Foster'的所有记录改成Jodie Foster。
SQLite的使用--SQLite语句
SQLite的使⽤--SQLite语句⼀.SQLite的介绍1.为什么要存储数据?1.1 ⼿机数据⼤多都是从⽹络加载的,不存储,每次滚动界⾯都要从新发送⽹络请求加载数据,浪费流量 1.2 当⽤户没⽹的时候,就不能正常显⽰界⾯了1.3 将数据存储到本地,不⽤每次加载,没⽹的时候也可从本地存储的数据拿来显⽰2.存储数据的⽅式Plist(NSArray\NSDictionary)特点: 只能存储系统⾃带的数据类型, ⽐如NSDictory, NSArray等等. ⾃定义的对象⽆法存储Preference(偏好设置\NSUserDefaults)特点: 本质就是⼀个plist⽂件; 也是只能存储系统⾃带的数据类型, ⾃定义的对象⽆法存储NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)特点: 可以存储⾃⼰定义的数据类型, 但是都是⼀次性的全数据操作SQLite3特点: 存储⼀些⼤批量的数据, 排序, 统计等操作Core Data特点: 对SQLite3的⼀层⾯向对象的包装, 本质还是要转换成为对应的SQL语句去执⾏在所有的存储⽅式中,SQLite速度最快,效率最⾼.3.什么是SQLite?SQLite是⼀款轻型的嵌⼊式关系数据库它占⽤资源⾮常的低,在嵌⼊式设备中,可能只需要⼏百K的内存就够了⽬前⼴泛应⽤于移动设备中存储数据(Android/iOS)处理数据的速度⾮常快,效率⾮常⾼4.什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库(类似于excel表格)数据库可以分为2⼤种类(了解)关系型数据库(主流)对象型数据库5.关系型数据库介绍⼆.Navicat软件的破解1.什么是Navicat?Navicat是数据库管理软件,⽀持⼤部分主流数据库(包括SQLite)(收费,要破解)可以通过图形化界⾯的⽅式来管理数据库2.有破解版,可以去⽹上搜索下载,⾃⼰安装,这⾥不做介绍三.Navicat软件的使⽤1.创建SQLite数据库2.创建表2.1 双击打开数据库,在tables中点击右键,选中NewTable2.2 创建表中对应的字段,点击”+”添加字段2.3 保存,要设置表格名称. 名称规范: t_名称如: t_student3.设置主键,添加数据3.1 什么是主键主键就相当于⾝份证⼀样,⽤来区分每⼀条数据3.2 设置主键注意点3.3 添加,删除,修改数据3.31 直接点击”+” 添加数据注意:主键的值不要修改3.32 删除,选中⼀⾏,点击”-“ 直接删除注意:删除⼀组数据后,主键值就不会再被回收使⽤. ⼀个主键值只对应⼀条数据,⽆论数据是否存在 3.33 修改数据双击想要修改的数据,直接修改四.SQLite的使⽤步骤1.创建数据库(⼀个⽤于存储数据的⽂件)通常后缀名为: .db 或 .sqlite2.创建表⽤于存储数据创建表时需要指定该表有哪些字段⽐如学⽣表有:学号/姓名/年龄/⾝⾼等3.对表进⾏增删改查操作⽐如添加⼀条学⽣数据:型号:1/姓名:why/年龄:18/⾝⾼:1.88五.SQL简介1.怎么在程序中使⽤SQLite?真实使⽤SQLite时⽤代码来操作的2.怎么⽤代码操作SQLite?使⽤SQL语句来操作3.SQL介绍不做过多介绍,直接看下定义就⾏了六.在代码中使⽤DDL(数据定义语句)1.先导⼊libsqlite3.tba框架(c语⾔)2.创建桥接⽂件,配置桥接⽂件(不会的话,看之前笔记)3.创建数据库// 创建数据库// ⽂件路径 :// 1.获取数据库的存放路径(沙盒中)let filePath = "/Users/xiaomage/Desktop/123.sqlite"let cString = filePath.cStringUsingEncoding(NSUTF8StringEncoding)!// 2.定义数据库对象(后⾯还要⽤,定义⼀个属性替代)// var db : COpaquePointer = nil// 3.打开/创建数据库对象if sqlite3_open(cString, &db) == SQLITE_OK {print("创建/打开数据库成功")} else {print("失败")}}4.创建表4.1 创建SQL语句4.2 执⾏语句(要对语句进⾏判断) if 语句 == SQLITE_OK 4.3 创建表格式CREATE TABLE IF NOT EXISTS '表名' ('字段名' 类型(INTEGER, REAL, TEXT, BLOB)NOT NULL 不允许为空PRIMARY KEY 主键AUTOINCREMENT ⾃增长,'字段名2' 类型,...)4.4 语句说明CREATE TABLE:创建⼀张表IF NOT EXISTS:不存在则创建't_student':表的名称NOT NULL:不允许为空PRIMARY KEY:主键AUTOINCREMENT:⾃动增加'id' INTEGER:有⼀个ID字段,类型是INTEGER5.删除表5.1删除表的格式DROP TABLE IF EXISTS '表名';5.2 语句说明DROP TABLE:删除表IF EXISTS:存在则删除'表名':要删除的表的名称1// 1.获取要执⾏的SQL语句2 let createTableSQL = "DROP TABLE IF EXISTS t_student;"34// 2.执⾏语句5if sqlite3_exec(db, createTableSQL.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil) == SQLITE_OK {6 print("删除表成功")7 } else {8 print("删除表失败")9 }10 }6.封装SQL语句6.1 创建/打开数据库的代码全部⼀样,可以封装起来6.2 创建语句,执⾏语句步骤都⼀样,只有语句的内容不⼀样,可以把语句当做参数,封装起来6.3 封装⼯具类,最好把实例对象设计为单例class SQLiteManager {// 设计单例对象static let shareInstance : SQLiteManager = SQLiteManager()// 数据库对象var db : COpaquePointer = nil}// MARK:- 打开数据库的操作extension SQLiteManager {func openDB(filePath : String) -> Bool {// 1.将Swift字符串转成C语⾔的字符串let cString = filePath.cStringUsingEncoding(NSUTF8StringEncoding)!// 3.打开/创建数据库对象return sqlite3_open(cString, &db) == SQLITE_OK}}// MARK:- 执⾏SQL语句extension SQLiteManager {func execSQL(sqlString : String) -> Bool {// 1.将Swift字符串转成C语⾔的字符串let cSQLString = sqlString.cStringUsingEncoding(NSUTF8StringEncoding)!// 2.执⾏语句return sqlite3_exec(db, cSQLString, nil, nil, nil) == SQLITE_OK}}七.在代码中使⽤DML(数据操作语句)1.插⼊数据1.1 插⼊数据格式INSERT INTO 't_student' (name, age, height) VALUES ('why', 18, 1.88);1.2 语句说明INSERT INTO: 插⼊数据't_student': 在哪⼀个表中插⼊数据(数据的字段): 给哪些字段插⼊数据VALUES ('why', 18, 1.88): 插⼊的具体值// 1.插⼊数据(获取插⼊语句)let insertSQL = "INSERT INTO t_student (name, age, height) VALUES ('why', 18, 1.88);" // 2.执⾏语句SQLiteManager.shareInstance.execSQL(insertSQL)2.更新数据1.1 更新数据格式UPDATE 't_student' SET 字段 = '值' WHERE 条件判断;1.2 语句说明UPDATE: 跟新数据't_student': 在哪⼀个表中更新数据SET 字段 = '值': 更新怎样的数据WHERE 条件判断: 更新哪些数据// 1.获取更新语句let updateSQL = "UPDATE t_student SET name = 'yz';"// 2.执⾏语句SQLiteManager.shareInstance.execSQL(updateSQL)3.删除数据3.1 删除数据格式DELETE FROM t_student;DELETE FROM t_student WHERE age < 50;3.2 语句说明DELETE FROM: 从表中删除数据t_student : 表名可以跟条件也可以不跟:不跟表⽰删除所有的数据// 1.获取删除语句let deleteSQL = "DELETE FROM t_student;"// 2.执⾏语句SQLiteManager.shareInstance.execSQL(deleteSQL)4.真实开发如何插⼊数据4.1 真实开发插⼊数据,不可能⼀条⼀条去写4.2 ⼀般来说,我们开发都是⾯向模型的4.3 可以把要插⼊的数据包装成模型4.4 在模型中提供⽅法,快速插⼊数据4.5 遍历模型数组,利⽤模型中快速插⼊数据的⽅法插⼊数据5.怎么把数据包装成模型?遍历数据,把数据的每⼀个字段作为模型的属性保存起来// 模拟从⽹络服务器中请求到很多数据(实际中数据是⽹络来的,这⾥⾃⼰写模拟)for _ in0..<100 {let name = "zs\(arc4random_uniform(100))"let age = Int(10 + arc4random_uniform(10))let height = 1 + Double(arc4random_uniform(10)) / 10.0let stu = Student(name: name, age: age, height: height)stus.append(stu)}模型中代码:1class Student: NSObject {2 var name : String = ""3 var age : Int = 04 var height : Double = 0.056 init(name : String, age : Int, height : Double) {7 = name8 self.age = age9 self.height = height10 }11 }1213 extension Student {14 func insertDB() {15// 1.插⼊数据(获取插⼊语句)16 let insertSQL = "INSERT INTO t_student (name, age, height) VALUES ('\(name)', \(age), \(height));" 17// 2.执⾏语句18 SQLiteManager.shareInstance.execSQL(insertSQL)19 }20 }控制器中快速插⼊for stu in stus { stu.insertDB()}6.插⼊数据的优化6.1 如果有⼤量数据插⼊,在主线程执⾏,会阻塞ui6.2 插⼊⼤量数据怎么优化?6.21 在⼦线程进⾏数据插⼊6.22 ⼿动开启事务如果⼀条条数据进⾏插⼊时,那么每插⼊⼀条数据就会开启⼀次事务.(开启事务耗时)但是如果有明确的开启事务,那么系统就不会在插⼊每条数据时,再开启事务1 dispatch_async(dispatch_get_global_queue(0, 0)) {2//获取插⼊数据开始时间3 let startTime = CACurrentMediaTime()4// 开启事务5 let startSQL = "BEGIN TRANSACTION;"6 SQLiteManager.shareInstance.execSQL(startSQL)78for stu in self.stus {9 stu.insertDB()10 }11//关闭事务12 let commitSQL = "COMMIT TRANSACTION;"13 SQLiteManager.shareInstance.execSQL(commitSQL)14//获取插⼊数据结束时间15 let endTime = CACurrentMediaTime()16//获取插⼊数据耗时17 print(endTime - startTime)18 }19 }⼋.在代码中使⽤DQL(数据查询语句)1.查询语句2.查询数据代码实现步骤2.1 获取查询语句2.2 执⾏查询语句(得到的结果保存到数组中,最好是字典数组)2.3 遍历数组,字典转模型2.4 从模型中读取数据代码实现:1// 1.获取查询语句2 let querySQL = "SELECT * FROM t_student LIMIT 30, 30;";34// 2.执⾏语句 (执⾏语句封装到了⼀个⽅法⾥⾯)5 guard let dictArray = SQLiteManager.shareInstance.querySQL(querySQL) else { 6return7 }89// 3.遍历数组10 var tempArray = [Student]()11for dict in dictArray {12// 字典转模型13 tempArray.append(Student(dict: dict))14 }1516for stu in tempArray {17 print(, stu.age)18 }1920//执⾏语句代码实现21 func querySQL(querySQL : String) -> [[String : NSObject]]? {22// 0.将Swift字符串转成C语⾔字符串23 let cString = querySQL.cStringUsingEncoding(NSUTF8StringEncoding)!2425// 1.定义游标(指针)26 var stmt : COpaquePointer = nil2728// 2.给游标赋值29// 1> 参数⼀: 数据库对象30// 2> 参数⼆: SQL语句31// 3> 参数三: 该SQL语句的长度 -1 --> 系统⾃动计算32// 4> 参数四: 游标的地址33 guard sqlite3_prepare_v2(db, cString, -1, &stmt, nil) == SQLITE_OK else {34return nil35 }3637// 3.取出所有的数据38// 3.1.定义字典数组39 var dictArray = [[String : NSObject]]()4041// 3.2.判断是否有该条数据42while sqlite3_step(stmt) == SQLITE_ROW {43// 3.3.获取字段的个数44 let count = sqlite3_column_count(stmt)45// 3.4.定义字典46 var dict = [String : NSObject]()47// 3.5.遍历每⼀个字典48for i in0..<count {49// 3.6.取出该列的键50 let ckey = sqlite3_column_name(stmt, i)51 guard let key = String(UTF8String : ckey) else {52continue53 }54// 3.7.取出该列的值55 let cvalue = UnsafePointer<Int8>(sqlite3_column_text(stmt, i))56//将c语⾔字符串转成swift字符串57 let value = String(UTF8String : cvalue)5859// 3.8.将键值对放⼊到字典中60 dict[key] = value61 }62// 3.9.将字典放⼊到数组中63 dictArray.append(dict)64 }65return dictArray66 }67 }九.FMDB框架的使⽤1.FMDB框架的作⽤?FMDB是⽤来简化操作数据库的框架2.FDMB的基本使⽤2.1 创建数据库private lazy var db : FMDatabase = FMDatabase(path: "/Users/lgp/Desktop/321.sqlite") // 创建FMDatabase对象// 打开/创建数据if db.open() {print("打开成功")} else {print("失败")}2.2 创建/删除表插⼊/更新/删除数据本质都是⼀样的只有语句的内容不⼀样将语句内容换成对应的操作,就能执⾏该项操作(和SQLite语句⼀样) // 1.获取创建表的语句let createSQL = "INSERT INTO t_person (name, age, height) VALUES ('why', 18, 1.88);" // 2.执⾏语句db.executeUpdate(createSQL, withArgumentsInArray: nil)2.3 查询数据var db : FMDatabase?1 func querySQL(querySQL : String) -> [[String : NSObject]]? {2// 0.判断db是否有值 db定义为属性3 guard let db = db else {4return nil5 }6// 1.执⾏查询语句结果为集合7 let results = db.executeQuery(querySQL, withArgumentsInArray: nil)89// 2.获取数据10// 2.0.定义数据11 var dictArray = [[String : NSObject]]()1213// 2.1.判断结果集中是否有内容14while results.next() {1516 let count = results.columnCount()1718 var dict = [String : NSObject]()1920for i in0..<count {21 let key = results.columnNameForIndex(i)22 let value = results.stringForColumnIndex(i) 2324 dict[key] = value25 }26 dictArray.append(dict)27 }28return dictArray29 }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解17_创建数据库与完成数据添删改查--------------------------------------1.SQLite介绍:最大特点是,无数据类型; 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER n n 、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型 n n 只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不 n n 过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以把各种类型的数n n 据保存到任何字段中,而不用关心字段声明的数据类型是什么。
例如:可以在Integer类型的 n n 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
n n n 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段 n n 保存除整数以外的数据时,将会产生错误。
另外, SQLite 在解析CREATE TABLE 语句时, n n 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段 n n 的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar n n (20)) SQLite可以解析大部分标准SQL语句,如:查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order byn n n 排序子句如:select * from person n n n n select * from person order by id desc n n n n select name from person group by name having count(*)>1 ---------------------------------------------------------------------------2.a.分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录n n select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 n b.select * from Account limit 3,5,指的是跳过前面的3条记录,然后获取5条记录n c.select * from Account limit 3,5是select * from Account limit 5 offset 3语句 n n 的简写版 -------------------------------------------------------------------------------n 3.常用操作: a.插入语句:insert into 表名(字段列表) values(值列表)。
如: insert into person nn n n (name, age) values(‘传智’,3) b.更新语句:update 表名 set 字段名=值where 条件子句。
如:update person set name=n n n n'credream‘where id=10 c.删除语句:delete from 表名 where 条件子句。
如:delete from person nwhere id=10 -------------------------------------------------------------------------------2.虽然无数据类型,但是建议加上,这样可以增加可读性,支持标准sql,oracle中的不行 ---------------------------------------------------3.获取添加记录后的自增长的ID值:select last_insert_rowid(); -----------------------------------------------------------4.在android中开发数据库应用: n a.创建数据库:以前在javaee时候,需要手工数据,但是android应用,需要运行在用户的 n n 手机上,所以,android应用,要有自动创建数据库功能,当第一次使用软件的时候 n n 就创建数据库----------------------------------------5.关于数据库自动创建的详细介绍: 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很 n n 多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出 n n 应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据 n n 表结构进行更新。
那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机 n n 上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方 n n 式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我 n n 们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版 n n 本进行管理来实现前面提出的需求。
n -----------------------------------------6.SQLite数据库添加,删除,改查操作 n A.创建数据库:SQLiteOpenHelper .getWritableDatabase ()或getReadableDatabase() n n 可以创建数据库7.创建完成以后可以使用SQLITE Expert软件打开生成的数据库n 可以看到除了生成的自己的需要的表之外,还生成了一张:android_metadata表: n 如果在sqlite中使用数据库一定会有一张android_metadata表,用来登记用户的 n 使用语言:zh_cn -----------------------------------------------------n b.数据库自动创建的过程及方法详细介绍: n n我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在 n n 很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建 n n 出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数n n 据表结构进行更新。
那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手 n n 机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工 n n 方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为n n 我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库n n 版本进行管理来实现前面提出的需求。
n -------------------------------------------8.详细介绍: 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是 n n onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, intn n n newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结n n 构。
当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获n n 取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生 n n 成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用 n n ,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
n n onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号, n n 而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数n n 据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为n n 了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如 n n 果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。
当软件的版本 n n 升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后 n n 作出相应的表结构及数据更新。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 n n SQLiteDatabase实例。
但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库n n 的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就 n n 会出错。
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了 n n ,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
------------------------------------------------------------------------9.创建数据库的代码: n a.创建项目:DBSQLIte n b./DBSQLIte/src/com/credream/service/DBOpenHelter.java n n packagecom.credream.service; n n import android.content.Context; importandroid.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 1); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ db.execSQL("alter table person add phone varchar(12) null"); n n } n n } --------------------------------------------------------2.在清单文件中写入测试环境 n n n <uses-libraryandroid:name="android.test.runner" /> n n n n n n </application> n<instrumentationandroid:name="android.test.InstrumentationTestRunner" n android:targetPackage="com.credream.db" android:label="Tests for My App" /> ----------------------------------------------------3./DBSQLIte/src/com/credream/test/PersonServiceTest.java package com.credream.test; n n import com.credream.service.DBOpenHelter; n n import android.test.AndroidTestCase; n n public class PersonServiceTest extends AndroidTestCase { //创建数据库,在<包>/database/ public void testCreateDB(){ DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext());dbOpenHelter.getWritableDatabase(); n } n n } -------------------------------------------------------4.选择方法开始测试,然后,在data/data/<包>/database/下 n 查看并用sqlite打开生成的数据库检查是否正确---------------------------------------------然后将版本号,改成2,然后再次执行,看到,表已经被更新,增加了一列phone -----------------------------------------------5.了解sqlite工作的原理: n DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n 打开getWritableDatabase();代码:。