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

android的基础学习:SQLite存储方式以及数据库操作

2014-05-12 15:47 1016 查看
android数据的四种存储方式为SharedPreference,SQLite,ContentProvider和File。

由于android系统中,Data基本都是私有的,都是存放于“/data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用ContentProvider。

SQLite:轻量级的嵌入式DataBase,基本支持SQL语法。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。最大的特点就是可以把任何数据存放在其中。

SharedPreference:除了SQLite数据库外,另一种Data存储方式,其本质就是一个xml文件,常用于存储简单的参数设置。重要存储类型为:boolean,int,float,long,string。

File:文件(I/O)存储方式。常用于存储大数量的数据,但是缺点是更新困难。

ContentProvider:Android系统中能实现所有的应用程序共享的一种数据存储方式,由于数据通常在各个应用间是互相私密的,所以此存储方式使用的较少,但却又是一种必不可缺的一种存储方式。例如,音频,图片和通讯录,一般都可以采用这种方式。每个ContentProvider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用ContentProvider为这些数据定义的一个URI,然后其他的应用程序就通过ContentProvider传入这个URI来对数据进行操作。

(其实还有一种存储方式是网络存储,通过网络上提供给我们的存储空间来上传和下载我们存储在网络中的数据信息)。

今天练习的是SQLite数据库的存储方式。首先,new一个android项目。然后new一个继承了SqliteOpenHelper的类(数据库创建与打开的帮助类),这里取名为PersonSqliteOpenHelper。写这个类的主要目的是定义数据库和创建Table。

代码如下:

package com.exampledatabasesqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

private static final String TAG = "PersonSQLiteOpenHelper";
/*
* 数据库的构造方法 用来定义数据库的名称,数据库查询结构集 数据库的版本
* @param context
*/
public PersonSQLiteOpenHelper(Context context
) {
super(context, "Person.db", null,3);
// TODO Auto-generated constructor stub
}
/*
* 数据库第一次被创建的时候的调用方法
* @param  db 被创建的数据库
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))");
}
/**
* 当数据库的版本号发生变化的时候调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG,"数据库的版本变化了。。。");
db.execSQL("alter table Person add account varchar(20)");
}

}


然后在MainActivity中实例化这个类。代码如下:

package com.exampledatabasesqlite;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

PersonSQLiteOpenHelper helper=new PersonSQLiteOpenHelper(this);
helper.getWritableDatabase();
}

}


在这里可以new一个test类来进行测试。

但是,这时我们进行测试,会出现一个错误提示:

解决方案如下:

在new一个android test project项目,在Select Test Target 中选择An existing Android Project中你自己要测试的项目名。完成之后,打开其Manifest.xml文件,将里面的<instrumentation>中的内容,copy到自己的Manifest.xml中<manifest>中。将里面的<uses-library >中的内容,copy到自己的Manifest.xml中<application>中。如下图所示:

在运行过测试代码时候,可以打开/data/data/程序包名,可以看到databases文件夹中有一个person.db文件和person.db-journal文件。将db文件导出到桌面,用SQLite Expert Professional管理工具打开查看。或者可以通过命令cmd来查看:首先让指令到达sdk下platform-tools下再输入命令代码:adb shell>>cd data/data>>cd com.exampledatabasesqlite(程序包名)>>ls
-l>>cd databases>>sqlite3 Person.db(数据库名)>>sql语句(一定要注意里面的大小写)

如图所示:

如下图所示:

Android下操作数据库的增删改查:

避免出现sql语句的错误,可以先将代码在sql工具中编写成功后再copy到代码里。

CRUD:

insert into person (name,number) values('ljr','99999')

select * from person where name='ljr'

update person set number='111111' where name='ljr'

delete from person where name = 'ljr'

先创建一个POJO。Person.java.再在db.dao包中new一个类,来写对数据库的增删改查的操作:代码如下:

package com.example.databasesqlite.domain;

public class Person {
private int id;
private String name;
private String number;
private int account;

public int getAccount() {
return account;
}
public void setAccount(int account) {
this.account = account;
}

@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", number=" + number
+ ", account=" + account + "]";
}
public Person(int id, String name, String number, int account) {
super();
this.id = id;
this.name = name;
this.number = number;
this.account = account;
}
public Person() {
super();
}

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}

}


另外也可以利用系统API来实现操作:

代码如下:

package com.example.databasesqlite.db.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.MediaStore.Video;

import com.example.databasesqlite.domain.Person;
import com.exampledatabasesqlite.PersonSQLiteOpenHelper;

public class PersonDaoAPI {

private PersonSQLiteOpenHelper helper;
//在构造方法里面完成helper的初始化

public PersonDaoAPI(Context context) {
helper=new PersonSQLiteOpenHelper(context);
}
/**
* 添加一条记录到数据库中
* @param name 姓名
* @param number 电话
*/
public long add(String name,String number,int account){
SQLiteDatabase db=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name", name);
values.put("number", number);
values.put("account", account);
long id=db.insert("Person", null, values);//insert方法有返回值
db.close();
return id;//-1添加失败。1成功
}

/**
* 查询记录是否存在
* @param name 姓名
* @return ture 存在 false 不存在
*/
public boolean find(String name){
SQLiteDatabase db=helper.getReadableDatabase();
Cursor  cursor=db.query( "Person", null, "name=?", new String[]{name}, null, null, null, null);
boolean result=cursor.moveToNext();
cursor.close();
db.close();
return result;

}
/**
* 修改一条记录
* @param name 姓名
* @param newnumber 修改后电话
*/
public int update(String name,String newnumber){
SQLiteDatabase db=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("number", newnumber);
int number=db.update("Person", values, "name=?", new String[]{name});//update方法的返回值为int类型,代表影响了多少行。
db.close();
return number;
}
/**
*删除一条记录
*@param name
*
*/
public int delete(String name)
{
SQLiteDatabase db=helper.getWritableDatabase();
int number=db.delete("Person", "name=?", new String[]{name});//delete方法的返回值为int类型,代表影响了多少行。0为没有成功
db.close();
return number;
}

/**
* 查询所有的信息
* @return list<Person>
*/
public List<Person> findAll()
{
SQLiteDatabase db=helper.getReadableDatabase();
List<Person> personList=new ArrayList<Person>();
Cursor cursor=db.query("Person", new String[]{"name","id","number","account"}, null, null, null, null, null);
while (cursor.moveToNext()) {
int id=cursor.getInt(cursor.getColumnIndex("id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
String number=cursor.getString(cursor.getColumnIndex("number"));
int account=cursor.getInt(cursor.getColumnIndex("account"));
Person p=new Person(id,name,number,account);
personList.add(p);
}
cursor.close();
return personList;
}

}


测试代码如下(最后引入了事务的概念):

package com.example.databasessqlite.test;

import java.util.List;

import com.example.databasesqlite.db.dao.PersonDaoAPI;
import com.example.databasesqlite.domain.Person;
import com.exampledatabasesqlite.PersonSQLiteOpenHelper;

import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;

public class testPersonDB extends AndroidTestCase {

public void testCreateDB() throws Exception{
PersonSQLiteOpenHelper helper=new PersonSQLiteOpenHelper(getContext());
SQLiteDatabase db=helper.getWritableDatabase();

}
public void testAdd() throws Exception{
PersonDaoAPI dao=new PersonDaoAPI(getContext());
dao.add("CrystalLee", "123456",99200);
dao.add("Lee", "234242",99);
}

public void testFind() throws Exception{
PersonDaoAPI dao=new PersonDaoAPI(getContext());
boolean result=dao.find("Crystal");
assertEquals(true, result);
}

public void testUpdate() throws Exception{
PersonDaoAPI dao=new PersonDaoAPI(getContext());
dao.update("Crystal", "666666");
}

public void testDelete() throws Exception{
PersonDaoAPI dao=new PersonDaoAPI(getContext());
dao.delete("Crystal");
}

public void testfindAll() throws Exception{
PersonDaoAPI dao=new PersonDaoAPI(getContext());
List<Person> persons=dao.findAll();
for(Person p:persons){
System.out.println(p.toString());
}
}

public void testTransaction() throws Exception{
PersonSQLiteOpenHelper helper=new PersonSQLiteOpenHelper(getContext());
SQLiteDatabase db=helper.getWritableDatabase();
db.beginTransaction();
try {

db.execSQL("update Person set account=account-1 where name =?",new Object[]{"CrystalLee"});
db.execSQL("update Person set account=account+1 where name =?",new Object[]{"Lee"});
//标记数据库事务执行成功
db.setTransactionSuccessful();
}catch(Exception ex){

}
finally {
db.endTransaction();
db.close();
}

}

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