Sqlite数据库存储
介绍
应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息
文件类型: .db
数据保存的路径: /data/data/projectPackage/databases/xxx.db
默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作
应用卸载时会删除此数据
SQLite (http://www.sqlite.org/),是一款轻型的关系型数据库服务器,
移动设备的数据库存储都使用SQLite, 它的特点:
安装文件小: 最小只有几百K, Android系统已经安装
支持多操作系统: Android, WP, IOS, Windows, Linux等
支持多语言: 比如 Java 、 PHP、C#等.
处理速度快: 处理速度比Mysql, Oracle, SqlServer都要快(前提是数据量不是特别大)
Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)
Sqlite数据库的客户端:
1.可以直接使用SQLiteExpertPers来直接打开电脑存在的数据库文件
2.也可以使用电脑的命令行进行进入Sqlite的数据库
adb shell 进入系统根目录
cd data/data/…/databases : 进入包含数据库文件的文件夹下
sqlite3 contacts2.db : 使用sqlite3命令连接指定的数据库文件, 进入连接模式
.help : 查看命令列表
.tables : 查看所有表的列表
执行insert/delete/update/select语句
.exit : 退出数据库连接模式
Ctrl + C : 直接退出sell模式
数据库常用操作
SQLite的数据类型:
Sqlite支持的数据类型与Mysql相似, 常用的数据类型
INT/INTEGER : 整数
FLOAT/DOUBLE : 小数
CHAR/VARCHAR/TEXT : 字符串文本
BLOB : 文件
DATE/ DATETIME : 日期/日期时间
SQLite如何建表:
Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:
最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动转换,
但除varchar类型外最好指定类型
Sqlite中的主键最名称建议使用_id
create table employee (
_id integer primary key autoincrement,
name varchar,
salary double,
birthday date
)
表的增删改查和关系型数据库的增删改查是一样的
API
SQLiteOpenHelper: 数据库操作的抽象帮助类:
SQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) : 构造方法, 指定数据库文件名和版本号
abstract void onCreate(SQLiteDatabase db) : 用于创建表,创建表也只是创建一次
那么如何保证只创建一次表呢?这个onCreate方法就是在数据库创建的时候进行调用
abstract void onUpgrade() : 用于版本更新
SqliteDatabase getReadableDatabase() : 得到数据库连接,能直接执行sql语句
SqliteDatabase: 代表与数据库的连接的类里面的方法:
long insert(): 用于执行insert SQL, 返回id值
int update(): 用于执行update SQL
int delete(): 用于执行delete SQL
Cursor query(): 用于执行select SQL, 返回包含查询结果数据的Cursor
void execSql(sql) : 执行sql语句
beginTransaction(): 开启事务
setTransactionSuccessful(): 设置事务是成功的
endTransaction(): 结束事务, 可能提交事务或回滚事务
SqliteDatabase.openDatabase(String path, CursorFactory factory, int flags): 得到数据库连接
Cursor : 包含所有查询结果记录的结果集对象(光标,游标)
int getCount() : 匹配的总记录数
boolean moveToNext() : 将游标移动到下一条记录的前面
Xxx getXxx(columnIndex) : 根据字段下标得到对应值
int getColumnIndex(columnname): 根据字段名得到对应的下标
例子
package com.example.datastorage;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class DBActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_db);
}
public void testCreateDB(View v)
{
MyDBHelper myDBHelper =new MyDBHelper(this, "jane.db",1);
myDBHelper.getReadableDatabase();
Toast.makeText(this, "创建数据库", 0).show();
}
public void testUpdateDB(View v)
{
MyDBHelper myDBHelper =new MyDBHelper(this, "jane.db",2);
myDBHelper.getReadableDatabase();
Toast.makeText(this, "更新数据库", 0).show();
}
public void testInsert(View v)
{
MyDBHelper myDBHelper = new MyDBHelper(this, "jane.db", 2);
SQLiteDatabase database = myDBHelper.getReadableDatabase();
ContentValues values =new ContentValues();
values.put("name", "mirror");
values.put("age", 18);
long id = database.insert("person", null, values);
database.close();
Toast.makeText(this, "插入ID"+id, 0).show();
}
public void testUpdate(View v)
{
MyDBHelper myDBHelper = new MyDBHelper(this, "jane.db", 2);
SQLiteDatabase database = myDBHelper.getReadableDatabase();
ContentValues values =new ContentValues();
values.put("name", "feng");
values.put("age", 81);
int updateCount = database.update("person", values, "_id=?", new String[]{"1"});
Toast.makeText(this, "updateCount"+updateCount, 0).show();
}
public void testDelete(View v)
{
MyDBHelper myDBHelper = new MyDBHelper(this, "jane.db", 2);
SQLiteDatabase database = myDBHelper.getReadableDatabase();
int deleteCount = database.delete("person", "_id =2", null);
Toast.makeText(this, "deleteCount"+deleteCount, 0).show();
}
public void testQuery(View v)
{
MyDBHelper myDBHelper = new MyDBHelper(this, "jane.db", 2);
SQLiteDatabase database = myDBHelper.getReadableDatabase();
Cursor cursor = database.query("person", null, null, null, null, null, null);
while(cursor.moveToNext())
{
int id=cursor.getInt(0);
String name=cursor.getString(1);
int age=cursor.getInt(2);
Log.e("tag", id+"-"+name+"-"+age);
}
cursor.close();
database.close();
Toast.makeText(this, "Count"+cursor.getCount(), 0).show();
}
public void testTransaction(View v)
{
SQLiteDatabase database =null;
try
{
MyDBHelper myDBHelper = new MyDBHelper(this, "jane.db", 2);
database = myDBHelper.getReadableDatabase();
database.beginTransaction();
ContentValues values =new ContentValues();
values.put("age", 1);
int updateCount = database.update("person", values, "_id=?", new String[]{"1"});
ContentValues values2 =new ContentValues();
values2.put("age", 2);
int updateCount2 = database.update("person", values2, "_id=?", new String[]{"2"});
database.setTransactionSuccessful();
} finally
{
if(database!=null)
{
database.endTransaction();
database.close();
}
}
}
}
package com.example.datastorage;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBHelper extends SQLiteOpenHelper
{
public MyDBHelper(Context context, String name,int version)
{
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db)
{
String sql = "create table person(_id integer primary key autoincrement, name varchar,age int)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create DB"
android:onClick="testCreateDB"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update DB"
android:onClick="testUpdateDB"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Insert"
android:onClick="testInsert"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update"
android:onClick="testUpdate"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete"
android:onClick="testDelete"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="query"
android:onClick="testQuery"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Test Transaction"
android:onClick="testTransaction"/>
</LinearLayout>
Android中的junit测试
1. 添加配置信息
<application>
<! -- 使用android测试包 -->
<uses-library android:name="android.test.runner" />
</application>
<!-- android:targetPackage的值应与manifest的package的值一致-->
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage=""/>
2. 编写测试类
class Testextends AndroidTestCase
然后里面的方法的名称就是test开头,然后加上要测试的方法的首字母大写就行了
增删改查例子
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/BackList"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<Button
android:id="@+id/add"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="添加"
android:layout_weight="0"
android:onClick="add"/>
</LinearLayout>
package com.example.blacklist;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity
{
public ListView BackList;
public BlackNumberAdapter blackNumberAdapter;
public BlackNumberDao blackNumberDao;
public List<BlackNumber> data;
public int position;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BackList= (ListView) findViewById(R.id.BackList);
blackNumberAdapter =new BlackNumberAdapter();
blackNumberDao =new BlackNumberDao(this);
data =blackNumberDao.getAll();
BackList.setAdapter(blackNumberAdapter);
BackList.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, 1, 0, "修改");
menu.add(0, 2, 0, "删除");
AdapterContextMenuInfo info =(AdapterContextMenuInfo) menuInfo;
position = info.position;
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
BlackNumber blackNumber = data.get(position);
switch (item.getItemId())
{
case 1:
showUpdateDialog(blackNumber);
break;
case 2:
blackNumberDao.deleteByID(blackNumber.getId());
data.remove(position);
blackNumberAdapter.notifyDataSetChanged();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
private void showUpdateDialog(final BlackNumber blackNumber)
{
final EditText editText = new EditText(this);
editText.setHint(blackNumber.getNumber());
new AlertDialog.Builder(this)
.setTitle("更新黑名单")
.setView(editText)
.setPositiveButton("更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String newNumber = editText.getText().toString();
blackNumber.setNumber(newNumber);
blackNumberDao.update(blackNumber);
blackNumberAdapter.notifyDataSetChanged();
}
})
.setNegativeButton("取消", null)
.show();
}
public void add(View v)
{
final EditText editText =new EditText(this);
editText.setHint("请输入你的黑名单");
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setPositiveButton("添加", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
String number =editText.getText().toString();
BlackNumber blackNumber =new BlackNumber(-1, number );
blackNumberDao.add(blackNumber );
data.add(0, blackNumber);
blackNumberAdapter.notifyDataSetChanged();
}
})
.setNegativeButton("取消", null)
.show();
}
class BlackNumberAdapter extends BaseAdapter
{
@Override
public int getCount()
{
return data.size();
}
@Override
public Object getItem(int position)
{
return data.get(position);
}
@Override
public long getItemId(int position)
{
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView==null)
{
convertView=View.inflate(MainActivity.this, android.R.layout.simple_list_item_1, null);
}
BlackNumber blackNumber = data.get(position);
TextView textView =(TextView) convertView.findViewById(android.R.id.text1);
textView.setText(blackNumber.getNumber());
return convertView;
}
}
}
package com.example.blacklist;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MyDbHelper extends SQLiteOpenHelper
{
public MyDbHelper(Context context)
{
super(context, "black.db", null , 1);
}
@Override
public void onCreate(SQLiteDatabase db)
{
Log.i("TAG", "MyDbHelper onCreate()");
db.execSQL("create table black_number(_id integer primary key autoincrement, number varchar)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
package com.example.blacklist;
public class BlackNumber {
private int id;
private String number;
public BlackNumber(int id, String number) {
super();
this.id = id;
this.number = number;
}
public BlackNumber() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "BlackNumber [id=" + id + ", number=" + number + "]";
}
}
package com.example.blacklist;
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.util.Log;
public class BlackNumberDao
{
MyDbHelper myDbHelper;
public BlackNumberDao(Context context)
{
myDbHelper =new MyDbHelper(context);
}
public void add(BlackNumber blackNumber)
{
SQLiteDatabase database = myDbHelper.getReadableDatabase();
ContentValues values =new ContentValues();
values.put("number", blackNumber.getNumber());
long id = database.insert("black_number", null, values);
Log.e("TAG", "id="+id);
database.close();
}
public void deleteByID(int id)
{
SQLiteDatabase database = myDbHelper.getReadableDatabase();
ContentValues values =new ContentValues();
int deleteCount = database.delete("black_number","_id =?" , new String[]{id+""});
Log.e("TAG", "deleteCount="+deleteCount);
database.close();
}
public void update(BlackNumber blackNumber)
{
SQLiteDatabase database = myDbHelper.getReadableDatabase();
ContentValues values = new ContentValues();
values.put("number", blackNumber.getNumber());
int updateCount = database.update("black_number", values , "_id="+blackNumber.getId(), null);
Log.i("TAG", "updateCount="+updateCount);
database.close();
}
public List<BlackNumber> getAll()
{
List<BlackNumber> list = new ArrayList<BlackNumber>();
SQLiteDatabase database = myDbHelper.getReadableDatabase();
Cursor cursor = database.query("black_number", null, null, null, null, null, "_id desc");
while(cursor.moveToNext()) {
int id = cursor.getInt(0);
String number = cursor.getString(1);
list.add(new BlackNumber(id, number));
}
cursor.close();
database.close();
return list;
}
}