暑假时做的一个外包——仪器管理系统,我在写那个应用的时候就玩了会数据库,刚开始的时候用的是微软的Acess,挺简单。后来项目上要求用mySQL,于是补了补SQL语句的相关知识。最近开发安卓也需要数据库的支持。在未来以数据为主的大数据时代,数据库的应用应该是越来越广。就单拿应用程序来讲,数据库已经是每个应用程序不可或缺的部分了。看来是时候认真的学习下数据库相关的知识和应用了。
朋友推荐《head first 系列》丛书,《Head First SQL》http://book.douban.com/subject/2334295/
下来总结一下安卓中SQLite轻量级数据库的使用方法:
安卓上集成了一个轻量级的数据库,SQLite
使用数据库有两种办法,一个是利用SQLiteDatabase对象来操作,管理数据库。
常用的用于打开一个文件对应的数据库的方法有:
openDatabase
openOrCreateDatabase
获取数据库SQLiteDatabase对象后,就可以调用以下方法来操作数据库了
execSQL、insert、update、delete、query等
另外查询query方法会返回一个Cursor对象,并且提供了以下方法来移动查询结果的记录指针
move,moveToFirst、moveToLast,moveToNext,moveToPosition,moveToPrevious
(另外操作数据库可以选择使用SQL语句,也可以使用安卓所提供的简单方法insert、update、delete、query等)
使用SQLiteDatabase进行数据库操作的步骤如下
获取SQLiteDatabase对象,它代表了与数据库的链接。
调用SQLiteDatabase的方法来执行SQL语句,execSQL
操作SQL语句的执行结果
关闭SQLiteDatabase,回收资源
附上一个示例代码(利用的是SQL语句):
朋友推荐《head first 系列》丛书,《Head First SQL》http://book.douban.com/subject/2334295/
下来总结一下安卓中SQLite轻量级数据库的使用方法:
安卓上集成了一个轻量级的数据库,SQLite
使用数据库有两种办法,一个是利用SQLiteDatabase对象来操作,管理数据库。
常用的用于打开一个文件对应的数据库的方法有:
openDatabase
openOrCreateDatabase
获取数据库SQLiteDatabase对象后,就可以调用以下方法来操作数据库了
execSQL、insert、update、delete、query等
另外查询query方法会返回一个Cursor对象,并且提供了以下方法来移动查询结果的记录指针
move,moveToFirst、moveToLast,moveToNext,moveToPosition,moveToPrevious
(另外操作数据库可以选择使用SQL语句,也可以使用安卓所提供的简单方法insert、update、delete、query等)
使用SQLiteDatabase进行数据库操作的步骤如下
获取SQLiteDatabase对象,它代表了与数据库的链接。
调用SQLiteDatabase的方法来执行SQL语句,execSQL
操作SQL语句的执行结果
关闭SQLiteDatabase,回收资源
附上一个示例代码(利用的是SQL语句):
<pre name="code" class="java">package com.example.hellonotes;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class example extends Activity{
//创建SQLiteDatabase对象
SQLiteDatabase db;
Button bn;
ListView listView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用openDatabase等方法创建或者打开数据库,必须使用绝对路径,第二个参数是factory
db=SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()
+"/my.db3", null);
listView=(ListView)findViewById(R.id.show);
bn=(Button)findViewById(R.id.ok);
//使用匿名类作为参数
bn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取用户输入
String title=((EditText)findViewById(R.id.title)).getText().toString();
String content=((EditText)findViewById(R.id.content)).getText().toString();
try {
//另写个方法实现插入数据库的功能
insertData(db,title,content);
//使用SQL语句实现查询该表内的所有信息
Cursor cursor=db.rawQuery("select * from news_inf", null);
//另写的方法实现数据库的内容在listView中显示
inflateList(cursor);
} catch (SQLiteException se) {
//执行DDL创建数据表
db.execSQL("create table news_inf(_id integer"
+" primary key autoincrement,"
+" news_title varchar(50),"
+" news_content varchar(255))");
//指向insert语句插入数据
insertData(db,title,content);
//执行查询
Cursor cursor=db.rawQuery("select * from news_inf", null);
inflateList(cursor);
}
}
});
}
private void insertData(SQLiteDatabase db,String title,String content){
//执行插入语句
db.execSQL("insert into news_inf values(null,?,?)",new String[]{title,content});
}
private void inflateList(Cursor cursor)
{
//填充adapter
SimpleCursorAdapter adapter=new SimpleCursorAdapter(MainActivity.this, R.layout.line, cursor,
new String[]{"news_title","news_content"},
new int[]{R.id.my_title,R.id.my_content},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
//显示数据
listView.setAdapter(adapter);
}
public void onDestroy(){
super.onDestroy();
if(db!=null&&db.isOpen())
db.close();
}
}
第二种方法就是继承SQLiteOpenHelper类开发其子类,并且通过该子类的getReadableDatabase和getWritableDatabase方法打开数据库,利用close方法关闭数据库连接。另外提供了onCreate方法用于第一次创建数据库时候回调该方法onUpgrade方法当数据库版本更新的时候回调该方法。 扩展子类的代码如下:
<pre name="code" class="java">package com.example.hellonotes;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
//完成记事本必须考虑数据库
public class NotesDB extends SQLiteOpenHelper{
//表名,加上3列
public static final String TABLE_NAME="notes";
public static final String CONTENT="content";
public static final String ID="_id";
//保存图片
public static final String PATH="path";
//视频
public static final String VIDEO="video";
//保存文本的时间
public static final String TIME="time";
public NotesDB(Context context) {
//库名,版本号1
super(context,"notes", null, 1);
// TODO Auto-generated constructor stub
}
//创建数据库
@Override
public void onCreate(SQLiteDatabase db) {
//创建表加上表名,然后第一列是ID列,并且是主键自增,Integer类型
//内容和时间为TEXT类型,并且不能为空
//每个列名和后面定义的属性直接要以空格隔开
db.execSQL("CREATE TABLE"+TABLE_NAME+"("
+ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"
+CONTENT+" TEXT NOT NULL,"
+PATH+" TEXT NOT NULL,"+VIDEO+" TEXT NOT NULL,"
+TIME+" TEXT NOT NULL");
}
//更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
<p>当然对于扩展的子类来说,<span style="background:rgb(255,255,0);">它的作用就是允许应用程序通过该工具类获取<span style="font-family:Times New Roman;">SQLiteDatabase</span><span style="font-family:宋体;">的对象,起到管理数据库的初始化的作用</span></span>,接下来的程序就可以通过<span style="font-family:Times New Roman;">SQLiteDatabase</span><span style="font-family:宋体;">的对象对数据库进行操作了。所以利用</span><span style="font-family:Times New Roman;">SQLiteOpenHelper</span><span style="font-family:宋体;">这种方法来说,最终还是要利用</span><span style="font-family:Times New Roman;">SQLiteDatabase</span><span style="font-family:宋体;">的。</span></p><p>因此一条获取数据库对象的语句就是这么写的:</p><p>private SQLiteDatabase dbWriter=notesDB.getWritableDatabase()</p><p>getWritableDatabase<span style="font-family:宋体;">方法返回的就是一个</span><span style="font-family:Times New Roman;">SQLiteDatabase</span><span style="font-family:宋体;">对象。</span></p><p>以下是在主活动中对数据库的操作代码:</p>
<pre name="code" class="java">package com.example.hellonotes;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
public class MainActivity extends Activity {
//创建数据库并且添加内容,首先创建数据库对象
private NotesDB notesDB;
//添加可添加的权限
private SQLiteDatabase dbWriter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
notesDB=new NotesDB(this);
//获取当前可添加的权限,写入的权限,获取数据库对象
dbWriter=notesDB.getWritableDatabase();
addDB();
}
//添加具体内容的方法
public void addDB(){
//这里contentValues就是作为数据的打包,然后存入数据库分别的列,它的键值对和数据库的列和数据相对应
ContentValues cv=new ContentValues();
cv.put(NotesDB.CONTENT, "hello");
//添加时间列,获取设备的时间,单独的方法
cv.put(NotesDB.TIME, getTime());
//调取dbwriter的插入方法,插入到数据库
dbWriter.insert(NotesDB.TABLE_NAME, null, cv);
}
public String getTime(){
SimpleDateFormat format=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date curDate=new Date();
String str=format.format(curDate);
return str;
}
//退出时必须关闭数据库
public void onDestroy(){
super.onDestroy();
if(db!=null&&db.isOpen())
db.close();
}
}