Android 深入了解SQLite存储方式Word格式.docx
《Android 深入了解SQLite存储方式Word格式.docx》由会员分享,可在线阅读,更多相关《Android 深入了解SQLite存储方式Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
什么是ContentValues类?
ContentValues类和Hashmap/Hashtable比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个
String类型,而值都是基本类型。
什么是Cursor?
Cursor在Android当中是一个非常有用的接口,通过Cursor我们可以对从数据库查询出来的结果集进行随
机的读写访问。
OK,基本知识就介绍到这里,下面开始上代码:
还是按照我的一贯风格,代码中该解释的地方都已经在代码中及时注释和讲解了!
顺便来张项目截图:
我们先来看看xml的代码:
java代码:
1.<
?
xmlversion="
1.0"
encoding="
utf-8"
>
2.<
LinearLayoutxmlns:
android="
3.android:
orientation="
vertical"
android:
layout_width="
fill_parent"
4.android:
layout_height="
5.<
TextViewandroid:
6.android:
wrap_content"
text="
SQL练习!
(如果你使用的SD卡存储数据方式,为了保证正常操作,请你先点击创建一张表然后再操作)"
7.android:
textSize="
20sp"
textColor="
#ff0000"
id="
@+id/tv_title"
/>
8.<
Buttonandroid:
@+id/sql_addOne"
9.android:
插入一条记录"
<
/Button>
10.<
@+id/sql_check"
11.android:
查询数据库"
12.<
@+id/sql_edit"
13.android:
修改一条记录"
14.<
@+id/sql_deleteOne"
15.android:
删除一条记录"
16.<
@+id/sql_deleteTable"
17.android:
删除数据表单"
18.<
@+id/sql_newTable"
19.android:
新建数据表单"
20.<
/LinearLayout>
复制代码
xml中定义了我们需要练习用到的几个操作按钮,这里不多解释了,下面看java源码:
先看我们继承的SQLiteOpenHelper类
1.packageeoe.demo;
2.
3.
4.importandroid.content.Context;
5.importandroid.database.sqlite.SQLiteDatabase;
6.importandroid.database.sqlite.SQLiteOpenHelper;
7.importandroid.util.Log;
8./**
9.*
10.*@authorHimi
11.*@解释此类我们只需要传建一个构造函数以及重写两个方法就OK啦、
12.*
13.*/
14.publicclassMySQLiteOpenHelperextendsSQLiteOpenHelper{
15.publicfinalstaticintVERSION=1;
//版本号
16.publicfinalstaticStringTABLE_NAME="
himi"
;
//表名
17.publicfinalstaticStringID="
id"
//后面ContentProvider使用
18.publicfinalstaticStringTEXT="
text"
19.publicstaticfinalStringDATABASE_NAME="
Himi.db"
20.publicMySQLiteOpenHelper(Contextcontext){
21.//在Android中创建和打开一个数据库都可以使用openOrCreateDatabase方法来实现,
22.//因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;
23.//创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。
24.//下面是来创建一个名为"
DATABASE_NAME"
的数据库,并返回一个SQLiteDatabase对象
25.
26.super(context,DATABASE_NAME,null,VERSION);
27.}
28.@Override
29.//在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表;
30.publicvoidonCreate(SQLiteDatabasedb){
31.Stringstr_sql="
CREATETABLE"
+TABLE_NAME+"
("
+ID
32.+"
INTEGERPRIMARYKEYAUTOINCREMENT,"
+TEXT+"
text);
"
33.//CREATETABLE创建一张表然后后面是我们的表名
34.//然后表的列,第一个是id方便操作数据,int类型
35.//PRIMARYKEY是指主键这是一个int型,用于唯一的标识一行;
36.//AUTOINCREMENT表示数据库会为每条记录的key加一,确保记录的唯一性;
37.//最后我加入一列文本String类型
38.//----------注意:
这里str_sql是sql语句,类似dos命令,要注意空格!
39.db.execSQL(str_sql);
40.//execSQL()方法是执行一句sql语句
41.//虽然此句我们生成了一张数据库表和包含该表的sql.himi文件,
42.//但是要注意不是方法是创建,是传入的一句str_sql这句sql语句表示创建!
!
43.}
44.@Override
45.publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
46.//一般默认情况下,当我们插入数据库就立即更新
47.//当数据库需要升级的时候,Android系统会主动的调用这个方法。
48.//一般我们在这个方法里边删除数据表,并建立新的数据表,
49.//当然是否还需要做其他的操作,完全取决于游戏需求。
50.Log.v("
Himi"
"
onUpgrade"
);
51.}
52.}
下面看最重要的MainActivity中的代码:
4.importjava.io.File;
5.importjava.io.IOException;
6.importandroid.app.Activity;
7.importandroid.content.ContentValues;
8.importandroid.database.Cursor;
9.importandroid.database.sqlite.SQLiteDatabase;
10.importandroid.os.Bundle;
11.importandroid.view.View;
12.importandroid.view.Window;
13.importandroid.view.WindowManager;
14.importandroid.view.View.OnClickListener;
15.importandroid.widget.Button;
16.importandroid.widget.TextView;
17.
18.
19.//------------第三种保存方式--------《SQLite》---------
20./**
21.*@authorHimi
22.*@保存方式:
SQLite轻量级数据库、
23.*@优点:
可以将自己的数据存储到文件系统或者数据库当中,也可以将自己的数据存
24.*储到SQLite数据库当中,还可以存到SD卡中
25.*@注意1:
数据库对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,
26.*数据库的名字也是唯一的。
27.*@注意2apk中创建的数据库外部的进程是没有权限去读/写的,
28.*我们需要把数据库文件创建到sdcard上可以解决类似问题.
29.*@注意3当你删除id靠前的数据或者全部删除数据的时候,SQLite不会自动排序,
30.*也就是说再添加数据的时候你不指定id那么SQLite默认还是在原有id最后添加一条新数据
31.*@注意4android中的SQLite语法大小写不敏感,也就是说不区分大小写;
32.*
33.*/
34.publicclassMainActivityextendsActivityimplementsOnClickListener{
35.privateButtonbtn_addOne,btn_deleteone,btn_check,btn_deleteTable,
36.btn_edit,btn_newTable;
37.privateTextViewtv;
38.privateMySQLiteOpenHelpermyOpenHelper;
//创建一个继承SQLiteOpenHelper类实例
39.privateSQLiteDatabasemysql;
40.//---------------以下两个成员变量是针对在SD卡中存储数据库文件使用
41.//privateFilepath=newFile("
/sdcard/himi"
//创建目录
42.//privateFilef=newFile("
/sdcard/himi/himi.db"
//创建文件
43.@Override
44.publicvoidonCreate(BundlesavedInstanceState){
45.super.onCreate(savedInstanceState);
46.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
47.WindowManager.LayoutParams.FLAG_FULLSCREEN);
48.this.requestWindowFeature(Window.FEATURE_NO_TITLE);
49.setContentView(R.layout.main);
50.tv=(TextView)findViewById(R.id.tv_title);
51.btn_addOne=(Button)findViewById(R.id.sql_addOne);
52.btn_check=(Button)findViewById(R.id.sql_check);
53.btn_deleteone=(Button)findViewById(R.id.sql_deleteOne);
54.btn_deleteTable=(Button)findViewById(R.id.sql_deleteTable);
55.btn_newTable=(Button)findViewById(R.id.sql_newTable);
56.btn_edit=(Button)findViewById(R.id.sql_edit);
57.btn_edit.setOnClickListener(this);
58.btn_addOne.setOnClickListener(this);
59.btn_check.setOnClickListener(this);
60.btn_deleteone.setOnClickListener(this);
61.btn_deleteTable.setOnClickListener(this);
62.btn_newTable.setOnClickListener(this);
63.myOpenHelper=newMySQLiteOpenHelper(this);
//实例一个数据库辅助器
64.//备注1----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:
65.//if(!
path.exists()){//目录存在返回false
66.//path.mkdirs();
//创建一个目录
67.//}
68.//if(!
f.exists()){//文件存在返回false
69.//try{
70.//f.createNewFile();
//创建文件
71.//}catch(IOExceptione){
72.////TODOAuto-generatedcatchblock
73.//e.printStackTrace();
74.//}
75.//}
76.}
77.@Override
78.publicvoidonClick(Viewv){
79.try{
80.//备注2----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:
81.//mysql=SQLiteDatabase.openOrCreateDatabase(f,null);
82.//备注3---如果想把数据库文件默认放在系统中,那么创建数据库mysql如下操作:
83.mysql=myOpenHelper.getWritableDatabase();
//实例数据库
84.if(v==btn_addOne){//添加数据
85.//----------------------读写句柄来插入---------
86.//ContentValues其实就是一个哈希表HashMap,key值是字段名称,
87.//Value值是字段的值。
然后通过ContentValues的put方法就可以
88.//把数据放到ContentValues中,然后插入到表中去!
89.ContentValuescv=newContentValues();
90.cv.put(MySQLiteOpenHelper.TEXT,"
测试新的数据"
91.mysql.insert(MySQLiteOpenHelper.TABLE_NAME,null,cv);
92.//inser()第一个参数标识需要插入操作的表名
93.//第二个参数:
默认传null即可
94.//第三个是插入的数据
95.//----------------------SQL语句插入--------------
96.//StringINSERT_DATA=
97.//"
INSERTINTOhimi(id,text)values(1,'
通过SQL语句插入'
)"
98.//db.execSQL(INSERT_DATA);
99.tv.setText("
添加数据成功!
点击查看数据库查询"
100.}elseif(v==btn_deleteone){//删除数据
101.//----------------------读写句柄来删除
102.mysql.delete("
MySQLiteOpenHelper.ID+"
=1"
null);
103.//第一个参数需要操作的表名
104.//第二个参数为id+操作的下标如果这里我们传入null,表示全部删除
105.//第三个参数默认传null即可
106.//-----------------------SQL语句来删除
107.//StringDELETE_DATA="
DELETEFROMhimiWHEREid=1"
108.//db.execSQL(DELETE_DATA);
109.tv.setText("
删除数据成功!
110.}elseif(v==btn_check){//遍历数据
111.//备注4------
112.Cursorcur=mysql.rawQuery("
SELECT*FROM"
113.+MySQLiteOpenHelper.TABLE_NAME,null);
114.if(cur!
=null){
115.Stringtemp="
116.inti=0;
117.while(cur.moveToNext()){//直到返回false说明表中到了数据末尾
118.temp+=cur.getString(0);
119.//参数0指的是列的下标,这里的0指的是id列
120.temp+=cur.getString
(1);
121.//这里的0相对于当前应该是咱们的text列了
122.i++;
123.temp+="
"
//这里是我整理显示格式,呵呵~
124.if(i%3==0)//这里是我整理显示格式,呵呵~
125.temp+="
\n"
//这里是我整理显示格式,呵呵~
126.}
127.tv.setText(temp);
128.}
129.}elseif(v==btn_edit){//修改数据
130.//------------------------句柄方式来修改-------------
131.ContentValuescv