SQLite数据库简单的认识
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它 占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多 程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度 比他们都快。SQLite第一个Alpha诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
SQLite特性
下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.
1. ACID事务
2. 零配置 – 无需安装和管理配置
3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享
5. 支持数据库大小至2TB
6. 足够小, 大致3万行C代码, 250K
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单, 轻松的API
9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open, 你可以用于任何用途, 包括出售它
13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python
下面我以一个完整的Demo例子来展示对SQLite数据库操作,包括对数据库表的增、删、改、查等基本操作。下面的一个截图是该演示Demo的项目框架图:
通过上面的截图可以看到该项目src目录下包含两个类:MainActivity.java 和 MySQLiteOpenHelper.java 。其中MySQLiteOpenHelper.java是对数据库操作辅助类。
布局文件main.xml的代码:
01 |
<? xml version = "1.0" encoding = "utf-8" ?>
|
02 |
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
|
03 |
android:orientation = "vertical"
|
04 |
android:layout_width = "fill_parent"
|
05 |
android:layout_height = "fill_parent" >
|
06 |
< TextView android:id = "@+id/tv_title"
|
07 |
android:layout_width = "fill_parent" android:layout_height = "wrap_content"
|
08 |
android:text = "Hello, Welcome to Andy's blog!" android:textSize = "16sp" />
|
09 |
|
10 |
< Button android:id = "@+id/newTable" android:layout_width = "fill_parent" |
11 |
android:layout_height = "wrap_content" android:text = "1.新建数据表" />
|
12 |
< Button android:id = "@+id/addOne" android:layout_width = "fill_parent" |
13 |
android:layout_height = "wrap_content" android:text = "2.插入一条记录" />
|
14 |
< Button android:id = "@+id/query" android:layout_width = "fill_parent" |
15 |
android:layout_height = "wrap_content" android:text = "3.查询数据库" />
|
16 |
< Button android:id = "@+id/editOne" android:layout_width = "fill_parent" |
17 |
android:layout_height = "wrap_content" android:text = "4.修改一条记录" />
|
18 |
< Button android:id = "@+id/deleteOne" android:layout_width = "fill_parent" |
19 |
android:layout_height = "wrap_content" android:text = "5.删除一条记录" />
|
20 |
< Button android:id = "@+id/deleteTable" android:layout_width = "fill_parent" |
21 |
android:layout_height = "wrap_content" android:text = "6.删除数据表" />
|
22 |
|
23 |
< TextView android:id = "@+id/tv_result"
|
24 |
android:layout_width = "fill_parent" android:layout_height = "wrap_content"
|
25 |
android:text = "测试显示的结果" android:textSize = "16sp" />
|
26 |
|
27 |
</ LinearLayout >
|
MainActivity.java代码:
001 |
package com.andyidea.sqlite; |
002 |
import java.io.File; |
003 |
import java.io.IOException; |
004 |
import android.app.Activity; |
005 |
import android.content.ContentValues; |
006 |
import android.database.Cursor; |
007 |
import android.database.sqlite.SQLiteDatabase; |
008 |
import android.os.Bundle; |
009 |
import android.view.View; |
010 |
import android.view.View.OnClickListener; |
011 |
import android.widget.Button; |
012 |
import android.widget.TextView; |
013 |
import android.widget.Toast; |
014 |
public class MainActivity extends Activity {
|
015 |
private Button btn_newTable,btn_addOne,btn_query,
|
016 |
btn_editOne,btn_deleteOne,btn_deleteTable;
|
017 |
private TextView tv;
|
018 |
private MySQLiteOpenHelper myOpenHelper;
|
019 |
private SQLiteDatabase sqlitedb;
|
020 |
|
021 |
//----以下两个成员变量是针对在SD卡中存储数据库文件使用----
|
022 |
//private File path = new File("/sdcard/dbfile"); //数据库文件目录
|
023 |
//private File f = new File("/sdcard/dbfile/AndyDemo.db"); //数据库文件
|
024 |
|
025 |
/** Called when the activity is first created. */
|
026 |
@Override
|
027 |
public void onCreate(Bundle savedInstanceState) {
|
028 |
super.onCreate(savedInstanceState);
|
029 |
setContentView(R.layout.main);
|
030 |
|
031 |
initializeViews();
|
032 |
|
033 |
//实例化默认数据库辅助操作对象
|
034 |
myOpenHelper = new MySQLiteOpenHelper( this );
|
035 |
|
036 |
//----如要在SD卡中创建数据库文件,先做如下的判断和创建相对应的目录和文件----
|
037 |
//if(!path.exists()){ //判断目录是否存在
|
038 |
// path.mkdirs(); //创建目录
|
039 |
//}
|
040 |
//if(!f.exists()){ //判断文件是否存在
|
041 |
// try{
|
042 |
// f.createNewFile(); //创建文件
|
043 |
// }catch(IOException e){
|
044 |
// e.printStackTrace();
|
045 |
// }
|
046 |
//}
|
047 |
}
|
048 |
|
049 |
/**
|
050 |
* 初始化UI界面
|
051 |
*/
|
052 |
private void initializeViews(){
|
053 |
tv = (TextView)findViewById(R.id.tv_result);
|
054 |
btn_newTable = (Button)findViewById(R.id.newTable);
|
055 |
btn_addOne = (Button)findViewById(R.id.addOne);
|
056 |
btn_query = (Button)findViewById(R.id.query);
|
057 |
btn_editOne = (Button)findViewById(R.id.editOne);
|
058 |
btn_deleteOne = (Button)findViewById(R.id.deleteOne);
|
059 |
btn_deleteTable = (Button)findViewById(R.id.deleteTable);
|
060 |
|
061 |
btn_newTable.setOnClickListener( new ClickEvent());
|
062 |
btn_addOne.setOnClickListener( new ClickEvent());
|
063 |
btn_query.setOnClickListener( new ClickEvent());
|
064 |
btn_editOne.setOnClickListener( new ClickEvent());
|
065 |
btn_deleteOne.setOnClickListener( new ClickEvent());
|
066 |
btn_deleteTable.setOnClickListener( new ClickEvent());
|
067 |
}
|
068 |
|
069 |
class ClickEvent implements OnClickListener{
|
070 |
@Override
|
071 |
public void onClick(View v) {
|
072 |
try {
|
073 |
//[1]--如果是在默认的路径下创建数据库,那么实例化sqlitedb的操作如下
|
074 |
sqlitedb = myOpenHelper.getWritableDatabase(); //实例化数据库
|
075 |
|
076 |
//[2]--如果是在SD卡中创建数据库,那么实例化sqlitedb的操作如下
|
077 |
//sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
|
078 |
|
079 |
if (v == btn_newTable){ //1.新建数据表
|
080 |
String TABLE_NAME = "andy" ;
|
081 |
String ID = "id" ;
|
082 |
String TEXT = "text" ;
|
083 |
String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
|
084 |
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
|
085 |
+ " text );" ;
|
086 |
sqlitedb.execSQL(str_sql2);
|
087 |
tv.setText( "新建数据表成功!" );
|
088 |
|
089 |
} else if (v == btn_addOne){ //2.插入一条记录
|
090 |
//----第1种插入数据的方法----
|
091 |
//ContentValues是一个哈希表HashMap,key值是对应数据表中字段名称,
|
092 |
//value值是字段的值。可以通过ContentValues的put方法把数据存放到
|
093 |
//ContentValues对象中,然后把数据插入到相对应的数据表中。
|
094 |
ContentValues cv = new ContentValues();
|
095 |
cv.put(MySQLiteOpenHelper.TEXT, "新数据" );
|
096 |
sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
|
097 |
//db.insert(String table, String nullColumnHack, ContentValues values);方法解说
|
098 |
//public long insert (String table, String nullColumnHack, ContentValues values)
|
099 |
//该方法是向数据表中插入一条记录
|
100 |
//[1]参数table:需要插入操作的表名
|
101 |
//[2]参数nullColumnHack:默认null即可,若在插入一行数据时,若没有指定某列的值,
|
102 |
// 则默认使用null值传入。
|
103 |
//[3]参数values:插入的数据
|
104 |
|
105 |
//----第2种插入数据的方法----
|
106 |
// String INSERT_DATA =
|
107 |
// "INSERT INTO andy (id,text) values (1, '第2种插入数据的方法')";
|
108 |
// sqlitedb.execSQL(INSERT_DATA);
|
109 |
|
110 |
tv.setText( "添加新数据成功!" );
|
111 |
|
112 |
} else if (v == btn_query){ //3.查询数据库
|
113 |
Cursor cur = sqlitedb.rawQuery( "SELECT * FROM " +MySQLiteOpenHelper.TABLE_NAME, null);
|
114 |
if (cur != null){
|
115 |
String temp = "" ;
|
116 |
int i = 0;
|
117 |
while (cur.moveToNext()){
|
118 |
temp += cur.getString(0); //0代表数据列的第一列,即id
|
119 |
temp += cur.getString(1); //1代表数据列的第二列,即text
|
120 |
i++;
|
121 |
temp += "/n" ; //定义显示数据的格式,一行一个数据
|
122 |
}
|
123 |
tv.setText(temp);
|
124 |
|
125 |
}
|
126 |
} else if (v == btn_editOne){ //4.修改一条记录
|
127 |
//----第1种方式修改数据----
|
128 |
ContentValues cv = new ContentValues();
|
129 |
cv.put(MySQLiteOpenHelper.TEXT, "更新后的数据" );
|
130 |
sqlitedb.update( "andy" , cv, "id " + "=" + Integer.toString(1), null);
|
131 |
//[1]参数table:需要操作的表名
|
132 |
//[2]参数values:ContentValues
|
133 |
//[3]参数whereClause:更新的条件
|
134 |
//[4]参数whereArgs:更新条件对应的值
|
135 |
|
136 |
//----第2种方式修改数据----
|
137 |
// String UPDATA_DATA =
|
138 |
// "UPDATE andy SET text='通过SQL语句来修改数据' WHERE id=1";
|
139 |
// sqlitedb.execSQL(UPDATA_DATA);
|
140 |
tv.setText( "修改数据成功!" );
|
141 |
|
142 |
} else if (v == btn_deleteOne){ //5.删除一条记录
|
143 |
//----第1种方式删除数据----
|
144 |
sqlitedb. delete ( "andy" , MySQLiteOpenHelper.ID + "= 1" , null);
|
145 |
//public int delete(String table, String whereClause, String[] whereArgs)解说
|
146 |
//[1]参数table:需要操作的表名
|
147 |
//[2]参数whereClause:删除的条件
|
148 |
//[3]参数whereArgs:删除条件对应的值
|
149 |
|
150 |
//----第2种方式删除数据----
|
151 |
//String DELETE_DATA = "DELETE FROM andy WHERE id=1";
|
152 |
//sqlitedb.execSQL(DELETE_DATA);
|
153 |
tv.setText( "删除数据成功!" );
|
154 |
|
155 |
} else if (v == btn_deleteTable){ //6.删除数据表
|
156 |
sqlitedb.execSQL( "DROP TABLE andy" );
|
157 |
tv.setText( "删除数据表成功!" );
|
158 |
|
159 |
}
|
160 |
} catch (Exception e){
|
161 |
tv.setText( "操作失败" );
|
162 |
}finally{
|
163 |
sqlitedb.close();
|
164 |
}
|
165 |
}
|
166 |
|
167 |
}
|
168 |
} |
MySQLiteOpenHelper辅助器类代码:
01 |
package com.andyidea.sqlite;
|
02 |
import android.content.Context;
|
03 |
import android.database.sqlite.SQLiteDatabase;
|
04 |
import android.database.sqlite.SQLiteOpenHelper;
|
05 |
import android.util.Log;
|
06 |
/** |
07 |
* 此类继承了SQLiteOpenHelper抽象类,是一个辅助器类,需要
|
08 |
* 一个构造函数和重写两个方法。
|
09 |
* @author Andy
|
10 |
*/
|
11 |
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
|
12 |
public static final String DATABASE_NAME = "AndyDemo.db" ; //数据库名
|
13 |
public static final int VERSION = 1 ; //版本号
|
14 |
public static final String TABLE_NAME = "andy" ; //表名
|
15 |
public static final String ID = "id" ;
|
16 |
public static final String TEXT = "text" ;
|
17 |
|
18 |
public MySQLiteOpenHelper(Context context) {
|
19 |
super (context, DATABASE_NAME, null , VERSION);
|
20 |
}
|
21 |
/**
|
22 |
* 在数据库第一次生成的时候会调用这个方法,同时我们在这个方法里边生成数据库表
|
23 |
*/
|
24 |
@Override
|
25 |
public void onCreate(SQLiteDatabase db) {
|
26 |
//创建数据表的操作
|
27 |
String strSQL = "CREATE TABLE " + TABLE_NAME + "(" + ID
|
28 |
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );" ;
|
29 |
|
30 |
db.execSQL(strSQL);
|
31 |
}
|
32 |
/**
|
33 |
* 更新或者升级数据库的时候会自动调用这个方法,一般我们会在这个方法中
|
34 |
* 删除数据表,然后再创建新的数据表操作。
|
35 |
*/
|
36 |
@Override
|
37 |
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
38 |
Log.e( "AndyDemo" , "onUpgrade" );
|
39 |
}
|
40 |
} |
当我们需要把数据库创建在SDCard中时,需要在AndroidManifest.xml文件中添加对SDCard操作的权限,如下:
1 |
< uses-permission android:name = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
|
2 |
< uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
|
通过以上步骤的操作,对SQLite数据库的操作有了大概的认识。下面我们来看看程序运行的效果。
文章出处:http://blog.csdn.net/cjjky/article/details/6578393
相关推荐
首先,Android提供了多种数据存储方式,包括内部存储、外部存储(如SDCard)、SQLite数据库、SharedPreferences以及文件系统。其中,SDCard主要用于存储大容量的数据,如媒体文件、应用备份等。使用SDCard的优点在于...
在描述中提及的“Android数据存储(内置sdcard)案例1”,可能是一个实际的代码示例,展示了如何在内部存储中创建和读取文件。通常,我们可以使用`getFilesDir()`或`getCacheDir()`方法获取内部存储的文件路径,然后...
在Android应用开发中,SQLite数据库是用于存储应用数据的一个重要组件。SQLite是一个轻量级的、嵌入式的关系型数据库,特别适合于移动设备,因为它不需要独立的服务进程,且占用资源少。以下将详细介绍Android中...
Android提供了多种方式来保存应用程序的数据,包括SharedPreferences、内存存储、SD卡存储以及SQLite数据库。这四种存储方式各有特点,适用于不同的场景需求。 1. SharedPreferences: SharedPreferences是一种轻量...
在Android系统中,数据存储是应用开发的重要环节,它涉及到用户数据的持久化,以便在应用关闭或...在实际应用中,开发者应根据需求选择合适的存储方式,并确保遵循最新的Android存储策略,以保证应用的兼容性和安全性。
在Android平台上,SQLite数据库是应用数据存储的主要方式之一。SQLite是一个轻量级的、嵌入式的、关系型数据库,它提供了强大的数据管理功能。当开发者需要对应用中的SQLite数据库进行备份与还原时,通常需要自定义...
在Android系统中,数据存储是应用开发者必须掌握的重要技能之一,尤其当涉及到用户数据的持久化时。"Android数据存储(内置sdcard3)"这个主题聚焦于Android设备上内部存储空间的第三部分,通常称为内部SD卡或者...
在Android系统中,数据存储是应用开发者必须掌握的重要技能之一,尤其对于内置SD卡(也称为内部存储)的使用,因为这涉及到用户数据的安全性和隐私保护。本篇将详细讲解Android数据存储在内置SDcard2(即内部存储)...
在Android开发中,这两个知识点是相当实用的,尤其是在处理数据存储和界面提示方面。下面我们将详细探讨这两个主题。 首先,Android数据库复制到SD卡是一个常见的需求,特别是在应用需要大量数据或者需要备份用户...
标题中的“数据库建立在sdcard的个人日记”指的是在Android设备的外部存储(通常是SD卡)上创建一个SQLite数据库来存储个人日记条目。SQLite是一个轻量级的关系型数据库管理系统,广泛应用于移动设备,因为它不需要...
- **实际操作**:在Activity中调用`writeFile()`方法将数据写入SDCard,并通过`DDMS`中的`File Explorer`查看文件是否成功创建。 ##### 4. SQLite数据原理 - **数据库介绍**:SQLite是一种嵌入式数据库解决方案,...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 ...• SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...
Android提供了多种数据存储方式,如内部存储、外部存储、SQLite数据库、SharedPreferences等。对于图片缓存,尤其是频繁访问的网络图片,我们通常选择外部存储中的SD卡(虽然现代Android设备可能没有物理SD卡,但...
在给出的压缩包文件`DataStorageDemo`中,可能包含了一些示例代码或教程,用于演示如何在Android应用中实现数据的内部存储和外部存储操作。通过学习和理解这些示例,开发者可以更好地掌握Android的数据持久化技术。
在Android开发中,根据应用程序的需求,数据存储方式有很多种选择,包括文件存储、SQLite数据库、SharedPreferences等。其中,文件存储是一种非常基础也是非常重要的一种数据存储方式。文件存储可以分为内部存储和...
接着是`Memory Database`(ch08_memory_database),这可能指的是在Android内存中创建临时数据库,通常用于测试或快速原型开发。虽然内存数据库在内存耗尽时会丢失数据,但它们的读写速度非常快,适合处理小量数据。...
在这个场景中,"数据库建立在sdcard的个人日记2" 指的是在Android的外部存储(即SD卡)上创建了一个SQLite数据库,用于存储用户的个人日记条目。 首先,我们需要理解Android的存储机制。Android系统提供了内部存储...
在Android应用开发中,将数据从SDcard上的SQLite数据库读取并显示在ListView上是一个常见的需求。这个过程涉及多个步骤,包括权限申请、ListView布局设计、数据库操作以及使用Adapter进行数据绑定。以下是对这些知识...