Android中的数据库操作--精华知识讲解,以及demo,数据库操作
1.知识讲解
1.1android中采用的数据库是SQLite数据库,是个轻量级,开源的数据库
1.2数据存储的基本结构--表格
表格被分成了栏位(column)和列位(row),每一列代表一笔资料,每一栏代表资料的一项(这与汉语中的行和列略有不同)
name | money | Date |
zhang | 10 | 1.1 |
wang | 23 | 1.1 |
li | 34 | 1.2 |
zhao | 45 | 2.3 |
该表格由3个栏位,4个列位 1.3 数据类型 (和其他的数据库不同,sqlite可以是无类型的,但是最好声明类型)
数据类型
类型
描 述
bit
整型
bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off
int
整型
int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节
smallint
整型
smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间
tinyint
整型
tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1 个字节
numeric
精确数值型
numeric数据类型与decimal 型相同
decimal
精确数值型
decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
money
货币型
money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一
smallmoney
货币型
smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一
float
近似数值型
float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
real
近似数值型
real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
datetime
日期时间型
datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒
Smalldatetime
日期时间型
smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
cursor
特殊数据型
cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
timestamp
特殊数据型
timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
Uniqueidentifier
特殊数据型
Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
char
字符型
char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符
varchar
字符型
varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
text
字符型
text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符
nchar
统一编码字符型
nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
nvarchar
统一编码字符型
nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
ntext
统一编码字符型
ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍
binary
二进制数据类型
binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
varbinary
二进制数据类型
varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
image
二进制数据类型
image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节
!sqlite对大小写不敏感的!4.数据库操作基本语言
无非是增删改查,同大部分数据库一样,这里不再赘述
5.数据库API
所有的数据库相关的接口,类都在android.database和android.database.sqlite这两个包下,下面列举其中关键的几个:
5.1 SQLiteOpenHelper--这是一个抽象类,关于抽象类,如果要使用,就一定要继承,这个类的方法很少,有一个构造方法
SQLiteOpenHelper(android.content.Context context, java.lang.String name,android.database.sqlite.SQLiteDatabase.CursorFactory factory, int version);
参数不做过多的解释,CursorFactory一般直接传null就可以
public void onCreate(SQLiteDatabase db) 此方法在创建数据库是被调用,所以,应该把创建表的操作放到这个方法里面,一会儿在后面我们会再详细的说如何创建表
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
从方法名上我们就能知道这个方法是执行更新的,没错,当version改变是系统会调用这个方法,所以在这个方法里应该执行删除现有表,然后手 动调用onCreate的操作
5.2 SQLiteDatabase
关于数据库的工作(增删改查)都在这个类里
execSQL(sql);执行SQL语句,用这个+SQL语句可以非常方便的执行增删改查
5.3 Cursor(神器,不解释)
游标(接口),这个很熟悉了吧,Cursor里面方法非常多,常用的有:
boolean mouveToPosition(position) 将指针移动到某记录
getColumnIndex(Contacts.People.Name)按列名获取ID
int getCount() 获取记录总数
boolean requery() 重新查询
boolean moveToFirst() moveToLast() moveToNext() moveToPosition(position)
数据库操作Demo
1.实现一个继承SQLiteOpenHelper类,可直接复制到自己的项目中
上述query()方法,返回一个Cursor,代表数据库中的全部数据,
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "coll.db";
private static final String TBL_NAME = "CollTbl";
private static final String CREATE_TBL = " create table "
+ " CollTbl(_id integer primary key autoincrement,name text,url text, desc text) ";
private SQLiteDatabase db;
DBHelper(Context c) {
super(c, DB_NAME, null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
this.db = db;
db.execSQL(CREATE_TBL);
}
public void insert(ContentValues values) {
SQLiteDatabase db = getWritableDatabase();
db.insert(TBL_NAME, null, values);
db.close();
}
public Cursor query() {
SQLiteDatabase db = getWritableDatabase();
Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);
return c;
}
public void del(int id) {
if (db == null)
db = getWritableDatabase();
db.delete(TBL_NAME, "_id=?", new String[] { String.valueOf(id) });
}
public void close() {
if (db != null)
db.close();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2.创建一个录入数据的类(根据自己的需求改)
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class AddActivity extends Activity {
private EditText et1, et2, et3;
private Button b1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
this.setTitle("添加收藏信息");
et1 = (EditText) findViewById(R.id.EditTextName);
et2 = (EditText) findViewById(R.id.EditTextUrl);
et3 = (EditText) findViewById(R.id.EditTextDesc);
b1 = (Button) findViewById(R.id.ButtonAdd);
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String name = et1.getText().toString();
String url = et2.getText().toString();
String desc = et3.getText().toString();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("url", url);
values.put("desc", desc);
DBHelper helper = new DBHelper(getApplicationContext());//实例化
helper.insert(values);//上面那个类中的插入方法
Intent intent = new Intent(AddActivity.this,
QueryActivity.class);
startActivity(intent);
}
});
}
}
3.创建一个显示数据的类:
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.OnItemClickListener;
public class QueryActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitle("浏览收藏信息");
final DBHelper helpter = new DBHelper(this);
Cursor c = helpter.query();
String[] from = { "_id", "name", "url", "desc" };
int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.row, c, from, to);
ListView listView = getListView();
listView.setAdapter(adapter);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
final long temp = arg3;
builder.setMessage("真的要删除该记录吗?").setPositiveButton("是",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
helpter.del((int)temp);
Cursor c = helpter.query();
String[] from = { "_id", "name", "url", "desc" };
int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),
R.layout.row, c, from, to);
ListView listView = getListView();
listView.setAdapter(adapter);
}
}).setNegativeButton("否",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
}
});
AlertDialog ad = builder.create();
ad.show();
}
});
helpter.close();
}
}
如果想具体到每一列的具体数据 ,看下面这个方法,先获得数据库中全部数据的列数num,然后在[0,num)中生一个随机数,然后指针跳到该列,获得该列的数据
DatabaseHelper helper=new DatabaseHelper(getApplicationContext());
Cursor cursor=helper.query();
int num=cursor.getCount();
if (num!=0){
Random rndRandom=new Random();
int p=rndRandom.nextInt(num);
cursor.moveToPosition(p);
String name=cursor.getString(1);
String wheres=cursor.getString(2);//注意这个wheres,不能用where,因为where是保留字
String money=cursor.getString(3);
String info=cursor.getString(4);}
上述几段代码,是数据库操作的一种模式,可以直接使用,代码也比较简单,要理解这种形式。
**获得andrid数据库文件,并在具体工具内打开,查看***
按照上面的操作进行数据库的操作后,如果想看到具体的数据表,需要一下几步:
1.首先一定要在虚拟机中启动项目,(手机启动我找过,找了半天没找到),然后再Eclipse中最右上角,选择DDMS窗口(没有的就打开视图,添加进来)
按照标号讲解:
1.选中虚拟机名称
4.在FileExplorer中可以看到全部文件
2.选择data打开
3.在data下面就有数据库具体文件
5.共有4个图标,分别是导出,导入到手机,删除,添加
6.就是所谓的DDMS
打开标号是3的data文件夹,选择数据表,用标号为5中的第一个按钮 导出到桌面上即可得到 databasename.db
下面就是打开啦!
需要用的工具/:推荐一个
使用方法:自己研究吧,跟一般的SQL工具一样
打开后就可以看到全部的的数据了!吼吼哈哈!到此就全部结束了!
至于代码,不需要把zip发给大家,上面的直接拷贝就能用了(改成你自己的具体内容)!
到此关键的操作都讲了,具体的SQLite知识,请自行谷歌