安卓中轻量级数据库SQLite的使用

暑假时做的一个外包——仪器管理系统,我在写那个应用的时候就玩了会数据库,刚开始的时候用的是微软的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语句):
<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();
	}
}



                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值