您的位置:首页 > 移动开发 > Android开发

Android中SQLite数据库的简单使用

2015-06-17 16:32 357 查看
File file = new File(“hah.txt”);

//只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在。如果文件不存在,则不会被创建。

必须要有文件输出流对文件进行了写的操作,文件才会被创建。

游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的。游标相当于数组的指针,通过游标的上下移动来查找数据。

在Android中使用SQLite数据库,需要继承SQLiteOpenHelper,该类没有提供默认的构造函数,所以在子类中必须显示的调用该类的构造函数。
创建数据库

package com.test.sqllitedemo;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class MyDBOpenHelper extends SQLiteOpenHelper {

//子类构造函数的参数不一定要和父类构造函数的参数一一对应

public MyDBOpenHelper(Context context) {

/**

* @paramcontext 上下文

* @paramname 数据库文件的名称

* @paramfactory 用来创建游标对象,null就用默认的游标工厂

* @paramversion 数据库的版本 号,从1开始。用来更新数据库。

* 数据库后缀名不是固定的,写为.db只是为了方便查看和识别

*/

super(context, "test.db", null,1);

}

@Override

//数据库第一次创建的时候自动执行

public void onCreate(SQLiteDatabase db) {

}

@Override

//数据库版本更新时自动执行

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

}

}

创建数据库

package com.test.sqllitedemo;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//执行该行代码,数据库不会被创建,只是创建了一个数据库对象

MyDBOpenHelper helper = new MyDBOpenHelper(this);

//创建或者打开一个数据库,该数据库具有读写权限,位于data/data/应用程序包名/databases
/文件夹下面

helper.getWritableDatabase();

}

}

在SQLite中创建表

SQLite中所有数据类型默认存储都是字符串类型的,没有长度限制的。超过表定义时的数据长度,也不会报错。

在Android中SQLite会自动创建一张名为android_metadata的表。用于存储当前的语言环境的。在SQLite中id推荐使用_id。

SQLite的数据库版本只能增大,不能减小。

package com.test.sqllitedemo;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class MyDBOpenHelper extends SQLiteOpenHelper {

//子类构造函数的参数不一定要和父类构造函数的参数一一对应

public MyDBOpenHelper(Context context) {

/**

* @paramcontext 上下文

* @paramname 数据库文件的名称

* @paramfactory 用来创建游标对象,null就用默认的游标工厂

* @paramversion 数据库的版本 号,从1开始。用来更新数据库。

* 数据库后缀名不是固定的,写为.db只是为了方便查看和识别

*/

super(context, "test.db", null,1);

}

@Override

//数据库第一次创建的时候自动执行,如果数据库已经存在,则不会再次调用该方法

/**

* 该方法中创建表结构,初始化数据库

* @param db 代表的是创建好的数据库

*/

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

//执行SQL语句

db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20))");

}

@Override

//数据库版本更新时自动执行,即数据库版本号有变化的时候执行 数据库的版本只能变大,不能变小

//int oldVersion, int newVersion用来完成跨版本升级数据库时保持数据

//如果是垄断性行业,数据是一次有效的情况下,可以强制以前数据失效的方式升级,让用户重新输入数据

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

db.execSQL("alter table info add money varchar(10)");

}

}

EL表达式只能在jsp页面中使用。

数据库的增删改查。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.test.databaseoper.MainActivity" >

<Button

android:onClick="add"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="add" />

<Button

android:onClick="update"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="update" />

<Button

android:onClick="delete"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="delete" />

<Button

android:onClick="query"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="query" />

</LinearLayout>

package com.test.databaseoper;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class MyDBOpenHelper extends SQLiteOpenHelper {

//子类构造函数的参数不一定要和父类构造函数的参数一一对应

public MyDBOpenHelper(Context context) {

/**

* @param context 上下文

* @param name 数据库文件的名称

* @param factory 用来创建游标对象,null就用默认的游标工厂

* @param version 数据库的版本 号,从1开始。用来更新数据库。

* 数据库后缀名不是固定的,写为.db只是为了方便查看和识别

*/

super(context, "test.db", null,1);

}

@Override

//数据库第一次创建的时候自动执行,如果数据库已经存在,则不会再次调用该方法

/**

* 该方法中创建表结构,初始化数据库

* @param db 代表的是创建好的数据库

*/

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

//执行SQL语句

db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varch ar(20))");

}

@Override

//数据库版本更新时自动执行,即数据库版本号有变化的时候执行 数据库的版本只能变大,不能变小

//int oldVersion, int newVersion用来完成跨版本升级数据库时保持数据

//如果是垄断性行业,数据是一次有效的情况下,可以强制以前数据失效的方式升级,让用户重新输入数据

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// TODO Auto-generated method stub

db.execSQL("alter table info add money varchar(10)");

}

}

package com.test.databaseoper;

import java.util.Random;

import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.view.View;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void add(View view){

//创建数据库

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

Random random = new Random();

String sql = "insert into info(name,phone)values(?,?)";

//在SQLite中,也可以使用占位符来传递参数

db.execSQL(sql, new Object[]{"lisi"+random.nextInt(100),"453231"});

//释放资源

db.close();

}

public void delete(View view){

}

public void update(View view){

}

public void query(View view){

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

String sql = "select * from info";

Cursor cursor = db.rawQuery(sql, null);

while (cursor.moveToNext()) {

String id = cursor.getString(0);

String name = cursor.getString(1);

String phone = cursor.getString(2);

System.out.println(id+" "+name+" "+phone);

}

//释放资源

cursor.close();

db.close();

}

}

在SQLite中,所有的数据都是当做字符串存的。

Android数据库中支持中文显示

查看SQLite中表中的数据的三种方式

1.写sql语句把数据查出,显示在logcat中查看

2.在应用程序独立数据区,把数据库pull出来,然后再可是话工具中查看

3.在命令行查看SQLite数据库中表中的数据



更改命令行默认的编码集

chcp(change current page) 65001(utf-8的编码值)

插入重复数据时,应该提示用户是否覆盖已有的数据。

删除数据时,应该提示用户是否确定删除。

程序的设计应该有良好的提示和操作方式。

查询操作不会更改数据库中的内容。一般获取可读的数据库。

多线程写数据库,必须明确写入的先后顺序。以及加锁。

读的操作可以多线程并发操作,写数据库的操作必须枷锁。

googleAndroidapi对数据库的增删改查

package com.test.databaseoper;

import java.util.Random;

import android.app.Activity;

import android.content.ContentValues;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.view.View;

import android.widget.Toast;

public class GoogleDataBaseOPR extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

public void add(View view) {

// 创建数据库

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

Random random = new Random();

ContentValues values = new ContentValues();

values.put("name", "lisi" + random.nextInt(100));

values.put("phone", "12345678");

/*

* db.insert(table, nullColumnHack, values)

* 第一个参数:表名

* 第二个参数:要填充空值的列

* 第三个参数:插入的值 map集合,ContentValues

*/

long id = db.insert("info", null, values);

if (id != -1) {

Toast.makeText(this, "添加成功,添加在" + id + "行", Toast.LENGTH_SHORT)

.show();

} else {

Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show();

}

// 释放资源

db.close();

}

public void delete(View view) {

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

/*

* db.delete(table, whereClause, whereArgs)

* 第一个参数:表名

* 第二个参数:选择条件

* 第三个参数:选择条件的参数

* 返回值:删除的行数,如果没有删除,返回0;

*/

int result = db.delete("info", null, null);

db.close();

if (result != 0) {

Toast.makeText(this, "删除"+ result + "行", Toast.LENGTH_SHORT)

.show();

} else {

Toast.makeText(this, "删除失败" , Toast.LENGTH_SHORT).show();

}

}

public void update(View view) {

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

/*

* db.update(table, values, whereClause, whereArgs)

* 第一个参数:表名

* 第二个参数:插入的值

* 第三个参数:选择条件,没有选择条件时填null

* 第四个参数:选择条件的参数 没有参数时填null

* 返回值:修改的行数,如果没有修改,返回0;

*/

ContentValues values = new ContentValues();

values.put("name", "lisi");

values.put("phone", "12345678");

int result = db.update("info", values, null, null);

if (result != 0) {

Toast.makeText(this, "修改了第"+ result + "行", Toast.LENGTH_SHORT)

.show();

} else {

Toast.makeText(this, "修改失败" , Toast.LENGTH_SHORT).show();

}

}

public void query(View view) {

MyDBOpenHelper helper = new MyDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

/*

* db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)

* 第一个参数:表名

* 第二个参数:返回的列 null表示返回所有列

* 第三个参数:选择条件,没有选择条件写null

* 第四个参数:选择条件的参数,没有选择条件参数写null

* 第五个参数:分组条件,没有写null

* 第六个参数:分组条件,没有写null

* 第七个参数:分组条件,没有写null

* 返回值:查询结果的记录的条数

*/

//Cursor cursor = db.query("info", null, null, null,null,null,null);

Cursorcursor=db.query("info",newString[]{"_id","name","phone"},null,null,null,null,null);

while (cursor.moveToNext()) {

String id = cursor.getString(0);

String name = cursor.getString(1);

String phone = cursor.getString(2);

System.out.println(id+" "+name+" "+phone);

}

//释放资源

cursor.close();

db.close();

db.close();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: