Android 本身有自带的数据库,不需要安装,本身就已经添加到库里面,我们只需要引入库文件,就能够操作,对于数据量比较少的应用是个比较好的选择。
对于Sqlite的操作,我们需要实例化SQLiteOpenHelper类,这是一个抽象类,必须要实例化,需要实现的方法有onCreate和onUpgrade。里面还有个版本号,这个对于更新数据库和修改数据库的设计的时候可能需要用到。
SQLiteOpenHelper 实例化实现的代码:
package com.bank;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;
import java.io.File;
/**
* Created by zhouchenglin on 2016/3/28.
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
//抽象类必须调用父类方法
public MySQLiteHelper(Context context, String name, CursorFactory factory, int version) {
//调用父类构造函数
super(context, getMyDatabaseName(name), factory, version);
}
private static String getMyDatabaseName(String name){
String databasename = name;
boolean isSdcardEnable = false;
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){//SDCard是否插入
isSdcardEnable = true;
}
String dbPath = null;
if(isSdcardEnable){
dbPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Finance/database/";
}else{//未插入SDCard,建在内存中
}
File dbp = new File(dbPath);
if(!dbp.exists()){
dbp.mkdirs();
}
databasename = dbPath + databasename;
return databasename;
}
/**
* 当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行.
* 重写onCreate方法,调用execSQL方法创建表
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("SWORD", "create a Database");
//创建数据库sql语句
String sql = "create table finance(ID integer PRIMARY KEY AUTOINCREMENT,Type varchar(10),Time varchar(20),Fee double,Remarks varchar(20),Budget varchar(10))";
//执行创建数据库操作
db.execSQL(sql);
}
@Override
//当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
接下来就是数据库具体的操作:
public void WriteData(ArrayList<String> Data)
{
mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
ContentValues cv=new ContentValues();
cv.put("Type",Data.get(0));
cv.put("Time",Data.get(1));
cv.put("Fee",Data.get(2));
cv.put("Remarks",Data.get(3));
cv.put("Budget",Data.get(4));
mDataBase.insert("Finance", "Type", cv);
mDataBase.close();
mMysql.close();
//结束当前activity
this.finish();
}
这个是自己写的插入到数据库的函数。
这个是从数据库里面读出数据:
//从数据库获得适配器数据
public void GetData() {
Cursor cursor = mDataBase.rawQuery("select Fee,Budget from finance",null);
cursor.moveToFirst();
if (cursor.getCount() > 0) {
for (int i = 0; i < cursor.getCount(); i++) {
// cursor.move(i);(最好选用MoveToNext,这个函数对于许多数据查询导致失败)
//移动到指定记录
double Fee = cursor.getDouble(cursor.getColumnIndex("Fee"));
String budget = cursor.getString(cursor.getColumnIndex("Budget"));
if(budget.equals("支出")) {
resultPay += Fee;
} else if (budget.equals("收入")){
resultIncome += Fee;
}
cursor.moveToNext();
}
}
cursor.close();
mDataBase.close();
mMysql.close();
}
删除数据:
public delete(string id)
{
String[] whereArgs = new String[]{String.valueOf(id)};
//获取当前数据库
mMysql = new MySQLiteHelper(BillsActivity.this, “finance.db”, null, 1);
mDataBase = mMysql.getReadableDatabase();
try {
mDataBase.delete(“Finance”, “ID=?”, whereArgs);
}
}
上面有些是自己开发项目app用到了代码,感觉不是很好,现在我重新整理了下,贴上代码:
package com.fasterry.sqldatabase;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Calendar;
public class MainActivity extends Activity {
//数据库
private MySQLiteHelper mMysql;
private SQLiteDatabase mDataBase;
private TextView getTime;
private Calendar calendar;// 用来装日期的
private DatePickerDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mian);
//获取当前数据库
mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
//写入数据库,有两种方法:
// 第一个种,调用sql
String sql ="insert into finance('Type','Time','Fee','Remarks','Budget') values('衣','20160330',37.6,'买衣服','支出')";
int i =0;
//写入10条,方便后面查看
while( i<20)
{
mDataBase.execSQL(sql);
i++;
}
//执行SQL语句,这个sql语句执行过后,返回值为空,所以一般查询不用这个sql语句
mDataBase.execSQL(sql);
//第二种方法,使用insert方法
//实例化一个ContentValues用来装载待插入的数据
ContentValues cv = new ContentValues();
cv.put("Budget","失败");
cv.put("Type","其他");
cv.put("Fee",25);
//Finance为表名,第二个参数表示其中一列的名字,没有就写null表示没有数据就为空,cv表示数据
mDataBase.insert("Finance",null,cv);
//数据删除有两种
String whereClause = "ID=?";//删除的条件
String[] whereArgs = {"12"};//删除的条件参数
mDataBase.delete("finance",whereClause,whereArgs);//执行删除
//sql语句
sql ="delete from finance where ID=13";
mDataBase.execSQL(sql);
//数据修改
cv = new ContentValues();//实例化ContentValues
cv.put("Type","bing1");//添加要更改的字段及内容
whereClause = "ID=?";//修改条件
whereArgs =new String[] {"1"};//修改条件的参数
mDataBase.update("finance",cv,whereClause,whereArgs);//执行修改
sql = "update [Finance] set Type = 'bing2' where ID=2";//修改的SQL语句
mDataBase.execSQL(sql);
//数据查询
Cursor c = mDataBase.query("finance",null,null,null,null,null,null);//查询并获得游标
if(c.moveToFirst()) {//判断游标是否为空
for (i = 0; i < c.getCount(); i++) {
// c.move(i);//移动到指定记录,数据过多会有问题
String username = c.getString(c.getColumnIndex("Type"));
String password = c.getString(c.getColumnIndex("Fee"));
c.moveToNext();
System.out.println(username+password);
}
}
c = mDataBase.rawQuery("select * from finance where ID=?",new String[]{"13"});
if(c.moveToFirst()) {
String password = c.getString(c.getColumnIndex("Remarks"));
System.out.println(password);
}
mDataBase.close();
mMysql.close();
}
}
这个是具体的操作,但写入到sd卡可能还是有问题,主要是android里面开发有权限问题,需要在AndroidManifest.xml添加读写权限。在application标签上面添加:
``
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
这样就能够在sd里面看到对应的数据库了。
数据库内容: