当前位置:文档之家› SQLite语法与Android数据库操作

SQLite语法与Android数据库操作

SQLite语法与Android数据库操作
SQLite语法与Android数据库操作

SQLite语法与Android数据库操作

学习android的小伙伴们在使用Android的SQLiteDatabase类进行数据库操作的时候总会有一些力不从心,特别是对于初涉数据库的小伙伴来说更是如此。

这是因为Android的SQLiteDatabase原本就不是依赖于Android而存在的,而是单独的作为一个个体而存在的,有着自己特有的体系和语言,而这就是SQL 语法了。

关于SQLite数据库的理论知识网上一搜一大片,这里就不多说。SQLite是一个轻量型的数据库,它对于大型数据库来说功能少,因此只需要学习一些通用的SQL语法就能够轻松掌握,而这些SQL语法对于其他的数据库来说也是基本不变化的。

但SQLite有个缺点,那就是作为轻量级选手的它,如果要保存大量数据会力有不及,因此它在android中适合保存个人设置等没有大量数据的信息。

好了,下面就是正式学习SQLite了,只有掌握了SQLite,掌握SQL语法,才能对Android中的数据库操作运用自如。

SQLite的数据类型

与Java语言一样,SQLite也有其特有的数据类型,当然相比MySQL来说只有5种数据类型算是很少了

NULL:空值相当于Java中的null

INTEGER:带符号的整型,相当于Java中的int型

REAL:浮点数字,相当于Java中float/double型

TEXT/VARCHAR:字符串文本,相当于Java中String类

BLOB:二进制对象,相当于Java中的byte数组,用于存放图片、声音等文件

Sqlite3中的约束

SQLite的约束是什么呢?约束就是限定数据库字段的条件,如果有个student数据表,它里面有一个age年龄的属性字段,我们要求数据库保存age 这个字段的时候必须有值,不能为空,那么就可以设置为:"age INTEGER NOT NULL"。这句话的意思就是age字段是不能为空的整型

NOT NULL :非空

UNIQUE :唯一

PRIMARY KEY :主键

FOREIGN KEY : 外键

CHECK :条件检查

DEFAULT : 默认

创建表,此时可对表里的结构和字段进行约束限定,将约束条件放在需要约束的字段之后

创建表

数据库是数据库,数据表是存放在数据库中存放信息的容器,这点大家要区分。

语法:

create table tabname(col1 type1 [not null][primary key], col2 type2[not null], ··· )

注:

tabname为表名

col1、col2为字段名字

type1、type2为字段类型

在[]中的约束条件是可以选的

例:

字段名类型长度约束说明

id INTEGER 主键,自增长编号

name VARCHAR 20 非空姓名

cid INTEGER 所在班级

age INTEGER 大于18且小于60 年龄

gender BIT 默认为1,表示男性别

score REAL 成绩

create table student(

id INTEGER PRIMARY KEY AUTOINCREMENT,

name VARCHAR(20) NOT NULL,

cid INTEGER,

age INTEGER CHECK(age>18 and age<60),

gender BIT DEFAULT(1),

score REAL);

注:SQL中不区分大小写

insert插入语句

数据库的操作无非四大类,增删改查这几种,因此必须要掌握这几种语句,insert增加也就是在数据表中添加信息

语法

insert into table1(field1, field2) values(value1, value2);

语法详解,在表名为table1的表的field1和field2字段分别插入value1和value2的值

例:

给student表中的各个字段插入值

insert into student (name, cid, age, gender, score) values ('tom', 1, 20, 1, 80.0);

注:其实可以在student后面不带有字段名,即name,cid···等,但如果不携带字段信息但看insert语句就无法直接明了的知道插入的value是给哪个字段赋值

update更新语句

语法:

update table1 set field1=value1 where 范围

语法详解:set后面是某个字段要更改的值,where表示限定field1字段value值在某个范围内才需要修改

set表示要修改哪个字段的值

where表示修改字段值的范围

例:

update student set name='jack' where name='tom';

将student表中name字段中value为tom的值修改为jack

select查询语句

select查询方法可以说是在数据库操作中使用最频繁的操作了,无论是想获取数据还是得知数据库中的信息都必须使用select语句,同时select语句也算得上在SQL语法中最复杂的语句了。

语法:

基础查询:

select * from table1 where 范围

语法详解:* 代表通配符,即所有的字段

select col1, col2, col3 from table1 where 范围;

查看col1, col2, col3字段的信息

例:

select * from student where name="jack"

查询student表中名字叫jack的所有字段的信息

select id, name, score from student;

查询student表中所有学生的编号、名字、分数

限制查询:

LIMIT关键字

select * from table1 LIMIT 5;

查询table1中前5行中的数据,LIMIT关键字后面加数字可限定返回多少条数据

OFFSET关键字

select * from table1 limit 5 offset 5;

查询table1中从第5行起的5行数据,OFFSET前面必须有LIMIT限定

例子:

select * from student limit 5;

查询table1中前5行中的数据

select * from limit 5 offset 5;

查询table1中从第5行起的5行数据

排序查询:

ORDER BY关键字

select * from table1 order by col1;

查询table1中所有数据,然后按照col1字段的升序排列(A-Z, 0-9)

select * from table1 order by col1, col2;

查询table1中所有数据,然后先按照col1字段的排列,然后按照col2字段排序

例子:

select * from student order by score;

查询student中所有数据,然后按照score字段的升序排列

select * from student order by name, score;

查询student中所有数据,然后先按照name字段的排列,然后按照score 字段排序

DESC关键字

select * from student order by name, score DESC;

查询student中所有数据,然后先按照name字段的排列,然后按照name 字段降序排序

注:DESC为降序排序,即(Z-A,9-0),DESC是DESCENDING缩写。

DESC必须跟着ORDER BY关键字后面;

DESC关键字只应用在直接位于其前面的列名;

与DESC相反的是ASC(即ASCENDING),在升序排序时可指定ASC,但这一关键字并没什么用处,因为升序是默认的

where过滤语句

where是过滤语句,数据会根据where自居的搜索条件进行过滤,一般情况下where跟在insert、delete、update、select后面。这是一个需要值得注意的语句,使用它能够极大的提高查询数据库的效率,而使用delete语句如果不带上过滤语句,则会把数据表中的所有信息删除!

注:当ORDER BY关键字和where一起使用的时候,ORDER BY应该位于where 后面,否则会报错。

where子句后面跟着的是过滤条件,过滤条件可使用逻辑符号,即>、<、=、!=等等逻辑符号,与计算机通用的逻辑符合并没有什么不同

例子:

select * from student where score>70.0 ORDER BY name;

查询student表中成绩大于70分的数据,同时按照名字升序排列

高级过滤:

AND关键字:必须满足前后两个条件的数据

select * from student where score>60 and score< 100;

查询student表中成绩大于60分并且小于100分的数据

OR关键字:只要满足前后任意一个条件即可

select * from student where score>90 or score<70;

查询student表中成绩大于90分并且或者小于70分的数据

AND和OR连用(and的优先级比or要高,两者连用的时候最后在各自的条件中添加圆括号()进行分组)

select * from student where (score>90 or score<70) and (age>19);

BETWEEN关键字:

select * from student where score between 70 and 80;

查询student表中分数在70至80分之间的数据

IN关键字:用于指定范围,范围中的每个条件都进行匹配,IN由一组逗号分隔、括在圆括号中的合法值

select * from student where name in('tom', 'Denesy');

查询student表中名字为tom和Denesy的数据

注:在指定要匹配值得清单的关键字中,IN和OR功能相当

IN可与and和or等其他操作符使用

IN操作符比一组OR操作符执行快

可以包含其他的SELECT语句

NOT关键字:否定其后条件的关键字

select * from student where not name='tom';

获取不包含名字为tom的信息

select * from student where not score>80;

获取分数不是大于80分的信息

空值检查:

select * from student where score is not null;

查询student表中score字段不为空的信息

delete删除语句

语法:

delete from table1 where 范围

语法详解:从table中删除某一范围内的数据(只能一条一条的删除,不能删除某个字段中的值)

注:不要漏掉where,否则会清空整个表中的信息

例:

delete from student where name='tom';

从student表中删除名字为tom的信息

delete from student where score< 90;

从student表中删除分数小于90分的信息

Android中的数据库操作

Android中的数据库操作其实只要掌握了上面的SQLite的基本知识,那么就很简单了。

首先我们要创建一个类继承自SQLiteOpenHelper,这个类的作用在于创建数据库和数据表。在Android中已经帮我们封装好了创建数据库的方法,因此只要写好创建数据表的语句就好了,而创建数据表的方法是使用原生的SQL语法,仅仅如此就让你不得不学习SQL语法了。

MyDatabaseHelper代码如下:

public class MyDatabaseHelper extends SQLiteOpenHelper {

// 创建Book数据表语法

public static final String CREATE_BOOK = "create table Book (" + "id integer primary key autoincrement, "

+ "author text, "

+ "price real, "

+ "pages integer, "

+ "bookname text)";

// 通过构造方法创建数据库,其中name为数据库名称

public MyDatabaseHelper(Context context, String name) {

super(context, name, null, 1);

}

@Override

public void onCreate(SQLiteDatabase db) {

// 执行创建数据表的语法

db.execSQL(CREATE_BOOK);

}

···

}

数据库操作类

为了方便大家阅读,这里将数据库操作都封装到一个类中,同时,将原本需要从外部传入的数据也直接在类中写入。

代码如下:

public class BookDao {

private MyDatabaseHelper helper;

public BookDao(Context context) {

helper = new MyDatabaseHelper(context, "BookStore.db");

}

/**

* 添加数据到Book表中

* @return 返回新插入的行号,如果插入失败返回-1

*/

public long addData() {

SQLiteDatabase database = helper.getReadableDatabase();

// 使用anddroid封装的SQL语法

ContentValues values = new ContentValues();

values.put("bookname", "The Da Vinci Code");

values.put("author", "Dan Brown");

values.put("pages", 454);

values.put("price", 16.96);

long insert = database.insert("Book", null, values);

values.clear();

values.put("bookname", "The Lost Symbol");

values.put("author", "Dan Brown");

values.put("pages", 510);

values.put("price", 19.95);

long insert1 = database.insert("Book", null, values);

return insert;

}

/**

* 更新Book表中的数据

* @return 返回受影响的行

*/

public int updateData() {

SQLiteDatabase database = helper.getReadableDatabase();

// 使用anddroid封装的SQL语法

ContentValues values = new ContentValues();

values.put("price", 10.99);

int update = database.update("Book", values, "bookname = ?", new String[] { "The Da Vinci Code" });

return update;

}

/**

* 删除Book中的数据

* @return 返回受影响的行

*/

public int delete() {

SQLiteDatabase database = helper.getReadableDatabase();

// 使用anddroid封装的SQL语法

int delete = database.delete("Book", "pages > ?", new String[] { "500" });

return delete;

}

/**

* 查询Book表中的数据

*/

public void query() {

SQLiteDatabase database = helper.getReadableDatabase();

// 使用原生SQL语法

Cursor cursor = database.query("Book", null, "price=?", new String[]{"10.99"}, "bookname", "author='Baby lin'", "author");

if (cursor.moveToFirst()) {

do {

String bookname = cursor.getString(cursor.getColumnIndex("bookname"));

String author = cursor.getString(cursor.getColumnIndex("author"));

int pages = cursor.getInt(cursor.getColumnIndex("pages"));

double price = cursor.getDouble(cursor.getColumnIndex("price"));

System.out.println("书名:" + bookname + " 作者:" +

author + " 页数" + pages + " 价格" + price);

} while (cursor.moveToNext());

}

cursor.close();

}

}

上面的代码虽然有些长,但其功能却很简单,也就是实现了数据库的增删查改这是个方法。

首先我们看到每个方法都有这么一行代码:

SQLiteDatabase database = helper.getReadableDatabase();

这一行代码是通过MyDatabaseHelper使用父类SQLiteOpenHelper 中有两个非常重要的实例方法,getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

详解addData()方法

其次,在addData()插入数据中有ContentValue这个类,这个类是用来存储要插入数据表中的数据的。

举个比较熟悉的例子,如ArrayList数据列表,我们可以在它里面存储String或者HashMap,而ContentValue就是类似ArrayList这样的容器。

实际上ContentValue里面存储的也是HashMap

通过ContentValue存储数据,然后再使用Android封装的insert方法,能够解析其中的数据,然后保存到数据表中。

其实深入Android中的insert方法,可以看到Android只是将insert方法中的参数取出还原为SQL原生语句,然后保存到数据表中。那么怎么在Android 使用原生的SQL方法呢?android在SQLiteDatabase对象中封装了execSQL()方法,可直接使用,当然,execSQL()方法又有完全使用SQL语句,一半使用SQL 语句一半使用Android参数的方法。下面是使用原生的SQL语句的代码:

public long addData() {

SQLiteDatabase database = helper.getReadableDatabase();

// 使用原生SQL语法

database.execSQL("insert into Book(bookname, author, pages, price) values('The Da Vinci Code', 'Dan Brown', 454, 16.96)");

// 使用原生与android封装方法,在values(?,?,?,?)有4个问号,

// 代表的是占位符,分别对应后面的String数组中的四个值。

database.execSQL("insert into Book(bookname, author, pages, price) values(?, ?, ?, ?)",

new String[]{"The Lost Symbol", "Dan Brown", "510", "19.95"});

return 0;

}

我们看到如果使用原生的SQL语句来保存数据库,代码量减少了很多。但是android为什么推荐我们使用它封装的方法呢?这是因为使用原生SQL语法不能获取返回值,因此一但出现问题,会造成App崩溃;同时使用SQL语句的时候不能拼错单词或出现其他问题,否则也会崩溃。

同时我们看到使用SQL语句中保持的数字都是String,与数据表中的限定的值不同,这是因为在保存过程中只要数据类型正确,会自动将"510"还原为整数型。

详解query()方法

除此之外,需要特别注意的便是查询数据库的query()方法

query(String table, String[] columns, String selection,

String[] selectionArgs, String groupBy, String having,

String orderBy) ;

这几个参数的意思是:

able:指定查询的表名,对应:from table_name

columns:指定查询的列名,对应select column1, column2

selection:指定where 的约束条件,对应:where column = value

selectionArgs:为where 中的占位符提供具体的值

groupBy:指定需要group by 的列,对应:group by column

having:value 对group by 后的结果进一步约束,对应:having column = value

orderBy:指定查询结果的排序方式,对应:order by column1, column2

这些参数中在SQL语法中都是有的,其后面对应的是相应的SQL语句。

group By这个关键字是归组的意思,用于与 SELECT 语句一起使用,来对相同的数据进行分组。在 SELECT 语句中,GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前。

也就是说如果使用GROUP BY子句,那么会见所有相同的字段的值合并为一条信息返回。

HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果。WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。

为了获取查询结构,首先插入这些数据:

database.execSQL(

"insert into Book(bookname, author, pages, price) values('The Da Vinci Code', 'Dan Brown', 454, 16.96)");

database.execSQL(

"insert into Book(bookname, author, pages, price) values('The Lost Symbol', 'Dan Brown', 510, 19.95)");

database.execSQL(

"insert into Book(bookname, author, pages, price) values('piao liu chuan shuo', 'Baby lin', 189, 12.99)");

database.execSQL(

"insert into Book(bookname, author, pages, price) values('lv bing xun chuan qi', 'Baby lin', 470, 10.99)");

database.execSQL(

"insert into Book(bookname, author, pages, price) values('bing yu huo zhi ge', 'Dan Brown', 624, 10.99)");

database.execSQL(

"insert into Book(bookname, author, pages, price) values('bing yu huo zhi ge', 'Dan Brown', 624, 10.99)");

database.execSQL(

"insert into Book(bookname, author, pages, price) values('wo yao du shu', 'Dan Brown', 510, 10.99)");

他们只有些许的区别,现在我们想查询价格是10.99元,然后按照bookname 进行归组,找出组里作者是Baby lin的那条信息,最后按照author排序(实质只有一条信息,没必要排序)。

这条信息由两种写法,一种是上面代码演示的,一种用原生SQL,如下:

Cursor cursor = database.rawQuery(

"select * from Book where price=10.99 group by bookname having

author='Baby lin' order by author", null);

这两种写法都可以的到Cursor这个对象,然后通过Cursor获得数据库中的数据。

Cursor的用法相对固定,通过while遍历,每次使用cursor.moveToNext()将游标移到下一行数据,如果能移动下一行数据则返回True,否则为false。

cursor.getString(int index)或者cursor.getInt(int index)传入相应字段在数据表中的排序便能获得在当前行的字段的值。

修改和删除

修改和删除就比前面两种方法简单多了。

修改update数据表的三种方法:

// 使用anddroid封装的SQL语法

ContentValues values = new ContentValues();

values.put("price", 10.99);

int update = database.update("Book", values, "bookname = ?", new String[] { "The Da Vinci Code" });

// 使用原生SQL语法

// database.execSQL("update Book SET price=10.99 where bookname='The Da

// Vinci Code' ");

// 使用原生与android封装方法

// database.execSQL("update Book SET price=? where bookname=? ", new String[] { "10.99", "The Da Vinci Code" });

删除delete数据表的三种方法:

int delete = database.delete("Book", "pages > ?", new String[] { "500" });

// 使用原生SQL语法

// database.execSQL("delete from Book where pages > 500");

// 使用原生与android封装方法

// database.execSQL("delete from Book where pages > ?", new String[] { "500" });

以上就是android中对于数据库操作的全部内容了!

内容提供者

研究完数据库,那么与数据库密切相关的内容提供者就不得不说说的,因为内容提供者也是依赖于数据库的实现的。

内容提供者也就是将当前应用的数据提供出去给其他的app使用,这是一个很好的功能,可惜一般情况下没有人会使用你的应用的信息,因为不知道是不是有陷阱。当然啦,支付宝、微博这些肯定会有人用的。

言归正传,我们来说说如何构建一个内容提供者,在这里以上一个项目的数据库作为内容提供者。

创建一个类继承自ContentProvider

ContentProvider有六个方法必须实现,他们是onCreate()和getType()以及数据库的增删查改四个方法,其中他们每个方法都会使用的Uri参数,这个参数是调用ContentResolver内容解析者的增删改查方法时传递过来的。

我们首先创建MyContentProvider继承ContentProvider。

然后在AndroidManifest.xml的application中添加内容提供者的注册清单:

android:name="com.example.databasecontentprovider.MyContentProvider"

android:authorities="com.example.databasecontentprovider.provider"

android:exported="true">

其中android:name是ContentProvider的全类名,android:authorities 属性中指定了该内容提供器的权限,android:exported表示该应用是否可供外部访问。

然后回到MyContentProvider中,我们写下以下代码:

public class MyContentProvider extends ContentProvider{

//定一个一个uri路径匹配器

private static final UriMatcher sUrimatcher = new UriMatcher(UriMatcher.NO_MATCH);

private static final int QUERYSUCESS = 0; //ctrl+shift+X 变大写小写加y

private static final int INSERTSUCESS = 1;

private static final int UPDATESUCESS = 2;

private static final int DELETESUCESS = 3;

private MyDatabaseHelper databaseHelper;

static {

sUrimatcher.addURI("com.example.databasecontentprovider.provider", "query", QUERYSUCESS);

sUrimatcher.addURI("com.example.databasecontentprovider.provider", "insert", INSERTSUCESS);

sUrimatcher.addURI("com.example.databasecontentprovider.provider", "update", UPDATESUCESS);

sUrimatcher.addURI("com.example.databasecontentprovider.provider", "delete", DELETESUCESS);

}

@Override

public boolean onCreate() {

databaseHelper = new MyDatabaseHelper(getContext(), "BookStore.db");

return false;

}

@Override

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

int code = sUrimatcher.match(uri);

if (code == QUERYSUCESS) {

SQLiteDatabase readableDatabase = databaseHelper.getReadableDatabase();

Cursor cursor = readableDatabase.query("Book", projection, selection, selectionArgs, null, null, sortOrder);

return cursor;

} else {

return null;

}

}

@Override

public String getType(Uri uri) {

// TODO Auto-generated method stub

return null;

}

@Override

public Uri insert(Uri uri, ContentValues values) {

int code = sUrimatcher.match(uri);

if (code == INSERTSUCESS){

SQLiteDatabase readableDatabase = databaseHelper.getReadableDatabase();

long insert = readableDatabase.insert("Book", null, values);

Uri myUri = Uri.parse("com.youCanDoIt/" + insert);

return myUri;

} else {

return null;

}

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

int code = sUrimatcher.match(uri);

if (code == DELETESUCESS) {

SQLiteDatabase readableDatabase = databaseHelper.getReadableDatabase();

int delete = readableDatabase.delete("Book", selection, selectionArgs);

return delete;

} else {

return 0;

}

}

@Override

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

int code = sUrimatcher.match(uri);

if (code == UPDATESUCESS){

SQLiteDatabase readableDatabase = databaseHelper.getReadableDatabase();

int update = readableDatabase.update("Book", values, selection, selectionArgs);

return update;

} else {

return 0;

}

}

}

其中UriMatcher这个实用类,我们可以当作是路径匹配器,它添加访问需要的路径名。

在UriMatcher构造方法中有UriMatcher.NO_MATCH这个参数,表示的是Uri 不匹配时返回的code

其中

sUrimatcher.addURI("com.example.databasecontentprovider.provider", "query", QUERYSUCESS);

这个方法,第一个参数这是在AndroidManifest.xml中内容提供者注册清单中的authorities,第二个参数需要匹配的路径名,第三个参数这是路径匹配时所返回的值。

那么query这个路径该怎么访问呢?

这时使用

Uri url = Uri.parse("content://com.example.databasecontentprovider.provider/que ry");

就能够解析这个路径,其中content://是协议,跟http://差不多。

设置好匹配器,也设置了访问路径,接下来就是提供给外部的权限方法了,现在我们先让其他的app有对数据库增删查改的方法,那么就要重新MyContentProvider中增删查改是个方法。

首先判断sUrimatcher.match(uri)是否能够匹配传过来的uri,如果返回的值刚好就与定义好的值相等,那么就返回这里增删查改方法中要返回的数据类型。

如public Cursor query(···)中要返回一个Cursor游标,那么就返回一个Cursor对象。

而public Uri insert( ···)最特殊,它要返回一个Uri,事实上这个Uri可以自定义,只需要符合相应规则就行,即com.xxxx即可,它最大的功能是让外部应用得到是否成功执行插入数据的操作。

这样一来,一个内容提供者就完成了。

总结一下,有以下几个步骤:

1、定义内容提供者定义一个类继承contentProvider

2、在清单文件里面配置一下内容提供者

3、定义一个Urimatcher

4、写一个静态代码块,添加匹配规则

5、按照我们添加的匹配规则,暴露想暴露的方法

内容访问者

内容提供者设置好之后,便要有访问者,内容访问者很简单,只要得到Uri 路径,然后使用ContentResolver内容访问者就好了。

我们新建一个MyContentResolver应用,添加增删查改四个按钮,然后在MainActivity中添加以下代码:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.doczj.com/doc/2918741456.html,yout.activity_main);

Button addData = (Button) findViewById(R.id.add_data);

Button queryData = (Button) findViewById(R.id.query_data);

Button updateData = (Button) findViewById(R.id.update_data);

Button deleteData = (Button) findViewById(R.id.delete_data);

addData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Uri url = Uri.parse("content://com.example.databasecontentprovider.provider/ins ert");

ContentValues values = new ContentValues();

values.put("bookname", "A Clash of Kings");

values.put("author", "George Martin");

values.put("pages", 1040);

values.put("price", 55.55);

ContentResolver contentResolver = getContentResolver();

Uri insert = contentResolver.insert(url, values);

System.out.println(insert);

}

});

queryData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Uri url = Uri.parse("content://com.example.databasecontentprovider.provider/que ry");

ContentResolver contentResolver = getContentResolver();

Cursor query = contentResolver.query(url, null, null, null, null);

if (query != null) {

while (query.moveToNext()){

String autor = query.getString(1);

String prices = query.getString(2);

String pages = query.getString(3);

String bookname = query.getString(4);

System.out.println(autor + "" + prices + "" + pages +"" + bookname);

}

}

}

});

updateData.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Uri url = Uri.parse("content://com.example.databasecontentprovider.provider/upd ate");

ContentValues values = new ContentValues();

values.put("bookname", "A Storm of Swords");

values.put("pages", 1216);

values.put("price", 24.05);

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

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 package com.credream.service; n n import android.content.Context; import android.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 n n n n n n n ---------------------------------------------------- 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();代码:

sqlite3常用命令及语法

https://www.doczj.com/doc/2918741456.html,/linchunhua/article/details/7184439 sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite 大量的被用于手机,PDA,MP3播放器以及机顶盒设备。 Mozilla Firefox使用SQLite作为数据库。 Mac计算机中的包含了多份SQLite的拷贝,用于不同的应用。 PHP将SQLite作为内置的数据库。 Skype客户端软件在内部使用SQLite。 SymbianOS(智能手机操作平台的领航)内置SQLite。 AOL邮件客户端绑定了SQLite。 Solaris 10在启动过程中需要使用SQLite。 McAfee杀毒软件使用SQLite。 iPhones使用SQLite。 Symbian和Apple以外的很多手机生产厂商使用SQLite。 下面就sqlite中的常用命令和语法介绍 https://www.doczj.com/doc/2918741456.html,/download.html可下载不同操作系统的相关版本sqlite gedit 也可以使用火狐中的插件sqlite manager 新建数据库 sqlite3 databasefilename 检查databasefilename是否存在,如果不存在就创建并进入数据库(如果直接退出,数据库文件不会创建)如果已经存在直接进入数据库对数据库进行操作 sqlite中命令: 以.开头,大小写敏感(数据库对象名称是大小写不敏感的) .exit .help 查看帮助针对命令 .database 显示数据库信息;包含当前数据库的位置 .tables 或者.table 显示表名称没有表则不显示 .schema 命令可以查看创建数据对象时的SQL命令; .schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示 .read FILENAME 执行指定文件中的SQL语句 .headers on/off 显示表头默认off .mode list|column|insert|line|tabs|tcl|csv 改变输出格式,具体如下 sqlite> .mode list sqlite> select * from emp; 7369|SMITH|CLERK|7902|17-12-1980|800||20 7499|ALLEN|SALESMAN|7698|20-02-1981|1600|300|30 如果字段值为NULL 默认不显示也就是显示空字符串

sqlite3数据库使用实例

SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table students( ...> id integer primary key, ...> name text not null unique, ...> sex int default 1, ...> bak text); sqlite> .tables students sqlite> .help .backup ?DB? FILE Backup DB (default "main") to FILE .bail ON|OFF Stop after hitting an error. Default OFF .databases List names and files of attached databases .dump ?TABLE? ... Dump the database in an SQL text format If TABLE specified, only dump tables matching LIKE pattern TABLE. .echo ON|OFF Turn command echo on or off .exit Exit this program .explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off. With no args, it turns EXPLAIN on. .header(s) ON|OFF Turn display of headers on or off .help Show this message .import FILE TABLE Import data from FILE into TABLE .indices ?TABLE? Show names of all indices If TABLE specified, only show indices for tables matching LIKE pattern TABLE. .load FILE ?ENTRY? Load an extension library .log FILE|off Turn logging on or off. FILE can be stderr/stdout .mode MODE ?TABLE? Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns. (See .width) html HTML

code insert SQL insert statements for TABLE line One value per line list Values delimited by .separator string tabs Tab-separated values tcl TCL list elements .nullvalue STRING Print STRING in place of NULL values .output FILENAME Send output to FILENAME .output stdout Send output to the screen .prompt MAIN CONTINUE Replace the standard prompts .quit Exit this program .read FILENAME Execute SQL in FILENAME

浅谈嵌入式SQLITE数据库实现与应用

开源(Opensource):这是它最强大的地方。开源,意味着你可以品读它的源码,你可以随时修改它,加入你自己的特性,而这一切完全免费的。开源,是一种精神。 实现部分 好了,现在从实现的角度来谈谈个人体会,这也是我比较关注的。 SQLite是一款优秀的嵌入式数据库管理系统,这里有两层含义:一是它经常作为动态库嵌入到应用程序; 另外一方面它通常用于嵌入式设备或其它要求较低的桌面应用。如果把它作为内存数据库,个人觉得不是很适合。毕竟,它的写并发性不是很好,此时,TimesTen也许会更好,Berkey DB也许是一个不错的选择。SQLite这样的嵌入式数据库与主存数据库的应用场景、实现以及对资源的需求都是不一样的。 (1)事务处理 事务的核心问题有两个:并发控制和恢复。解决了并发控制和恢复问题的系统,就能允许它的用户假设程序是原子的(atomically)执行的——好像没有其它的程序同时执行;而且是可靠的(reliably)——不会产生失败。原子性和可靠性的抽象,则称为事务(transaction)。其实,事务并不是DBMS的专利,任何分布式系统,都面对并发和恢复问题,而解决的方法就是事务,只不过,我们更常听到DBMS中的事务。 并发控制保证事务的原子执行,它使得交错执行的事务看起来是一个接一个的顺序执行的,完全没有交错执行。如果交错执行的结果与顺序执行的结果一致,则称为串行化(serializable)。 恢复使得数据库仅仅包含那些正常完成的事务的结果。如果事务在执行的过程中发生错误,不能继续进行,恢复算法必须清除部分完成事务产生的影响。 ?并发控制 SQLite只支持库级锁,库级锁意味着什么?——意味着同时只能允许一个写操作,也就是说,即事务T1在A表插入一条数据,事务T2在B表中插入一条数据,这两个操作不能同时进行,即使你的机器有100个CPU,也无法同时进行,而只能顺序进行。表级都不能并行,更别说元组级了——这就是库级锁。但是,SQLite尽量延迟申请X锁,直到数据块真正写盘时才申请X锁,这是非常巧妙而有效的。 ?恢复 SQLite的恢复技术是影子分页技术(shadow paging)技术的典型代表。 DBMS的常用恢复技术有影子分页技术与基于日志的技术,前者在早其数据库管理系统中用到,比如Sys tem R,现代DBMS中已经很难见到它的身影了。 影子分页技术与基于日志技术相比,优点是实现简单,消除了写日志记录的开销,恢复的速度也快(不需要redo和undo)。影子分页的缺点就是事务提交时要输出多个块,这使得提交的开销很大,而且以块为单位,很难应用到允许多个事务并发执行的情况——这是它致命的缺点。 (2)查询处理 SQLite的查询处理本质上就是一个SQL编译器和一个虚拟机。而实现这些功能只用了十多个文件,整个实现实现简单而有效,但是也存在一些问题。首先,SQLite字典数据很简单,实际上它的字典就一个表s qlite_mater,所有的信息都是通过对sqlite_master中SQL语句进行解析获取的,而解析一个SQL语句,都需要进行词法分析、语法分析、甚至虚拟机代码的生成。而这一过程是很需要时间的,而且,查询计划也没有重用。其次,查询优化还比较简单,特别是连接操作,只通过循环来做(MySQL也一样)。但是,仅仅数万代码,我们不能对它要求太苛求。 (3)存储模型

Android实验报告_基于SQLite的通信录

第一次实验Android界面设计 一. 实验目的及实验环境 1. 实验目的 1)掌握SQLiteOpenHelper类结构 2)掌握基于SQLite数据库的应用开发过程 3)掌握Content Provider发布数据的方法 4)掌握Content Resolver获取数据的方法 2.实验环境 系统开发平Android Studio 3.0 系统开发平台:Android 7.1 运行平台:Windows10 x64 运行环境:https://www.doczj.com/doc/2918741456.html, Framework SDK 2.0 二. 实验教材、组织方式、实验容 1.实验教材:Andorid开发与应用 2.组织方式:个人独立完成 2.实验容: 实现基于SQLite数据库的通信录应用,通过单击增加图标打开添加通信录界面,通过单击通信录中的各条信息可删除选中项。 三.方案设计 Android系统中集成了SQLite数据库,并且为数据库的操作提供了相关的类和方法,便于没有数据库开发经验的开发者编写程序。另外,Android平台中利用Content Provider机制来实现跨应用程序数据共享。一个应用程序可以通过Content Provider来发布自己的数据,其他的应用程序可以通过Content Resolver来获取共享数据。

四.运行结果

五.总结 通过这次实验掌握了SQLite OpenHelper类结构,掌握了基于SQLite数据库的应用开发过程以及Content Provider发布数据的方法和掌握Content Resolver 获取数据的方法。 六.附录:源代码 主布局文件activity_main.xml:

SQLITE3的操作方法及应用

数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件。 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中。 1.打开数据库,创建表 1.1sqlite*db;定义一个sqlite*的变量 sqlite3_open(“./link.db”,&db); 在当前目录下打开一个名为link.db的数据库,若是没有则在当前目录下创建一个名为link.db 的数据库。 1.2sql="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.3sqlite3_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。等下我们再看回调函数的写法,以及这个参数的使用。 第5个参数char**errmsg是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec之后,执行失败时可以查阅这个指针(直接printf(“%s\n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。 说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表

Android移动应用开发实验指导书

《Android移动应用开发》 实验指导书 课程代码: 总课时数: 适用专业: 院(系)名称:

实验一深入理解Activity 目标 (1)掌握Activity的开发、配置和使用。 (2)掌握Intent的几种常用的属性。 (3)Android系统内置Intent的使用。 (4)了解Activity的生命周期 实验软、硬件环境 硬件:PC电脑一台; 配置:winxp或win7系统,内存大于4G,硬盘250G及以上 JDK1.7 、Eclipse、ADT、Android SDK 实验主要技术基础 (1)活动是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互。 (2)Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。 任务 1、请在AndroidManifest.xml文件中配置SecondActivity: 配置Intent的Action属性为com.sise.intent.action.JHY_ACTION; 配置Category属性为com.sise.intent.category.JHY_CATEGORY。 通过隐式Intent的使用从FirstActivity启动SecondActivity,编写代码,运行程序,预期效果如下所示。

图1 程序运行初始化界面图2 点击图1中的按钮后的运行结果 2、请使用显式Intent启动SecondActivity,并使用Intent从FirstActiv传递数据到SecondActivity。编写代码,运行程序,预期效果如下所示。 图1 程序运行初始化界面图2 点击图1中的按钮后的运行结果 3、使用Intent传递数据从SecondActivity返回数据到FirstActivity中去。编写代码,运行程序,预期效果如下所示。 图1 程序运行初始化界面图2 点击图1按钮运行结果 图3 点击图2按钮运行结果 实验方法与步骤 (1)创建活动 Activity是Android系统提供的一个活动基类所有的活动都必须直接或间接继承此类才能拥有活动的特性。 (2)布局文件 创建布局文件 加载布局文件 (3)在清单文件中注册活动 (4)以上方法完成多个活动的创建 (5)使用Intent完成多个活动之间的交互和数据传递

Qt4访问sqlite数据库

目录 Qt4访问sqlite数据库 (2) RedHat 9 Linux下在QT3.1中连接SQLite3全过程详细记录 (6) 基于ARM-Linux的SQLite嵌入式数据库技术 (17) 关于在qt中如何连接sqlite3数据库的问题 (23) SQLite 完整中文FAQ (32) C/C++中调用SQLITE3的基本步骤 (40) SQLite嵌入式数据库系统的研究与实现 (50)

Qt4访问sqlite数据库 https://www.doczj.com/doc/2918741456.html,/index.php/2008/09/qt-sqlite/ sqlite简介 sqlite 是一款轻量级的、基于文件的嵌入式数据库,2000年就已经诞生,经过7年多的发展,直到今天已经成为最流行的嵌入式数据库,包括google在内的公司在其桌面软件中亦使用sqlite 存储用户数据。由此可以看出,已经没有任何理由去怀疑sqlite的稳定性了。 sqlite的优势 1. 免配置,和access一样,只要把数据库文件通过ftp上传到服务器上就可以使用,不需要服务器的额外支持 2. 备份方便,因为只是一个文件,只要复制一份该文件,就能备份整个数据库 3. 虽然是轻量级数据库,但他支持最大2tb 的单个库文件。 4. 快,无与伦比的快。经过实际测试,在几百万记录的情况下,sqlite的插入和查询速度和mysql 不分上下,快于sql server,10倍于access (但这并不意味着它可以替代sql server ) 用QT操作sqlite 由于sqlite属于轻量级的数据库,不需要配置,不需要安装,也不需要管理员,所以也就没必要像操作mysql等数据库一样的设置主机,用户和密码了。样例如下: 1 2 3 4 5 6 7 8 9 10 11 12 #include #include #include #include #include #include

Android 实验报告 Sqlite 数据库操作

2、掌握Android的SQLite数据库设计; 3、掌握Android的Activity 和Fragement用法; 4、熟悉XML 和JSon 文件读取 三、实验内容 要求使用SQLite数据库实现用户注册和登录,读取数据库信息,退出时生成XML文件或JSON文件。 四、实验过程和结果 content_main.xml: MainActivity.java: RegisterActivity.java: public class RegisterActivity extends Activity { SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/2918741456.html,yout.content_register); /*start*/ db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+"/user.db3", null); /**/ Button register = (Button)findViewById(R.id.register); register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = ((EditText)findViewById(https://www.doczj.com/doc/2918741456.html,ername)).getText().toString(); String password = ((EditText)findViewById(R.id.password)).getText().toString(); try{ String sql = "create table if not exists user_info (_id integer " + " primary key autoincrement," + " username varchar(255)," + " password varchar(255)" + ")"; db.execSQL(sql); sql = "insert into user_info values( null,?,?)";

sqlite 基本操作 全

sqlite3本地数据库学习 sqlite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比mysql还快,专门用于移动设备上进行适量的数据存取,它只是个文件,不需要服务器进程。 常用术语:表(table)、字段(colum,列,属性)、记录(row,record) 关键字:select、insert、updete、delete、from、creat、where、desc、order、by、group、table、alter、view、index等。 1、安装sqlite3 sudo()apt-get()install()sqlite3 2、存储类型 integer 整型:int,shoert,long text 文本字符串:string real 浮点型:float,double blob 二进制 3、字段结束 not null:字段的值不能为空 unique:字段的值必须是唯一的 default:指定字段的默认值 primarykey:主键,用来唯一的标识某条记录,相当于记录的身份证。主键可以是一个或多个字段,应由计算机自动生成和管理。主键字段默认包含了not null和unique两个约束。 autoincrement:当主键是integer类型时,应该增加autoincrement约束,能实现主键值的自动增长。 外键:利用外键可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键。 4、创建数据库usr.db在当前目录下 sqlite3()usr.db 5、创建表格,表格内容以树状存储 create()table()表名(字段名1()字段类型1,字段名2()字段类型2...) 6、数据库中不能使用关键字命名表和字段,不区分大小写,每条语句后加";"结尾 7、删除表格 drop()table()表名 8、向表格里添加数据 insert()into()表名(字段1,字段2...)values(字段1的值,字段2的值...) 8、修改表中的数据 updata()表名()set()字段1=字段1的值,字段2=字段2的值... //将字段为name全部修改成'Tom' updata()stu()set()name='Tom'; //将字段为id=1001的字段name修改成'Tom' updata()stu()set()name='Tom'()where()id=1001; //将字段为id=1001同时字段name='lisi'的字段name修改成'Tom' updata()stu()set()name='Tom'()where()id=1001()and()name='lisi'; 9、删除表中的数据

嵌入式系统技术报告(题目 SQLITE数据库的概述和使用)

合肥学院 嵌入式系统设计课程 技术报告 (2014-2015第2学期) 报告题目:SQLite数据库概述和使用专业:自动化 班级:级自动化卓越班 姓名: 指导老师:干开峰

摘要 自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变的非常庞大,并占用相当多的系统资源。嵌入式数据库直接在应用程序进程中运行,提供了零配置运行模式,并且资源占用非常少。作为一个开源的嵌入式数据库产品,SQLite具有系统开销小,检索效率高的特性,嵌入式数据库无须独立运行的数据库引擎,它是由程序直接调用相应的API去实现对数据的存取操作。更直白的讲,嵌入式数据库是一种具备了基本数据库特性的数据文件。嵌入式数据库与其它数据库产品的区别是,前者是程序驱动式,而后者是引擎响应式。嵌入式数据库的一个很重要的特点是体积非常小,同时,很多嵌入式数据库在性能上也优于其它数据库,所以在高性能的应用上也常见嵌入式数据库的身影。SQLite是D·理查德·希普开发出来的用一个小型C库实现的一种强有力的嵌入式关系数据库管理体制。SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库。 关键词:SQLite;嵌入式;数据库

目录 1SQLite简介 (1) 2SQLite工作原理 (1) 3SQLite的功能特性 (2) 4SQLite的结构 (2) 5SQLite的使用 (4) 5.1SQLite里面的一些基本的操作: (4) 5.2SQLite的一些类的使用及说明: (5) 5.3SQLite嵌入式数据库使用注意: (10) 6总结 (11)

sqlite命令

Sqlite命令操作 建立数据库档案 用sqlite3建立数据库的方法很简单,只要在shell下键入(以下$符号为shell 提示号,请勿键入): $ sqlite3 foo.db 如果目录下没有foo.db,sqlite3就会建立这个数据库。sqlite3并没有强制数据库档名要怎么取,如果你喜欢,也可以取个foo.icannameitwhateverilike 的档名。 在sqlite3提示列下操作 进入了sqlite3之后,会看到以下文字: SQLite version 3.1.3 Enter ".help" for instructions sqlite> 这时如果使用.help可以取得求助,.quit则是离开(请注意:不是quit) SQL的指令格式 所以的SQL指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去。 建立资料表 假设我们要建一个名叫film的资料表,只要键入以下指令就可以了:

create table film(title, length, year, starring); 这样我们就建立了一个名叫film的资料表,里面有name、length、year、starring 四个字段。 这个create table指令的语法为: create table table_name(field1, field2, field3, ...); table_name是资料表的名称,fieldx则是字段的名字。sqlite3与许多SQL数据库软件不同的是,它不在乎字段属于哪一种资料型态:sqlite3的字段可以储存任何东西:文字、数字、大量文字(blub),它会在适时自动转换。 建立索引 如果资料表有相当多的资料,我们便会建立索引来加快速度。好比说: create index film_title_index on film(title); 意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为 create index index_name on table_name(field_to_be_indexed); 一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。 加入一笔资料 接下来我们要加入资料了,加入的方法为使用insert into指令,语法为:insert into table_name values(data1, data2, data3, ...); 例如我们可以加入

相关主题
文本预览
相关文档 最新文档