SQLite数据库是一个开源的可以嵌入到应用程序中使用的轻量级的一种数据库,在Android应用中也是使用的这个.今天就来介绍一些这个数据库.
SQLite数据库操作的是文件,即数据库文件,可以实现对数据库文件的打开,查看,删除,更新等操作.
数据库操作使用到的类:BaseColumns 和SQLiteOpenHelper
1.SQLite数据库
1.在创建数据库之前,我们一般需将事先设计好的表对应一个实体类,然后在别的地方直接使用这里定义的名字.
// 如果处理要显示在ListView中的数据时,一个表一定有_id这个字段,否则会抛出异常.
// 一般这样设计,对应一个表;;;BaseColumns中存储这_id这个属性
public static class Cost implements BaseColumns {
// 表名
public static final String TABLE_NAME = "cost";
// 字段
public static final String MONEY = "money";
public static final String TYPE = "type";
public static final String SUB_TYPE = "subtype";
public static final String USE_TIME = "use_time";
}
2.我们一般还需要一个类继承SQLiteOpenHelper,实现应用在第一次安装或者版本更新时初始化数据库或者更新数据库的操作.这里涉及到一个重要的问题:版本控制(看代码)
@Override
public void onCreate(SQLiteDatabase db) {
/**
* 数据库第一次创建时执行的函数
* 只要有新的表添加,就要在onCreate中执行,分两种情况
* 1.如果用户第一安装应用,要创建所有的表
* 2.如果用户是版本更新,就会执行到onUpgrade方法,在那里创建后添加的表
*/
db.execSQL(CREATE_TABLE_COST);
db.execSQL(CREATE_TABLE_INCOME);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/**
* 数据库版本更新时执行的函数
* 1.在应用再次进入时,会执行到此方法,主要用于版本的更新.
* 2.这里知识一个简单的测试,如果有版本更新很多的情况,需要我们一一判断,然后去创建表
* 例如:版本从1-->4,就需要开发人员根据版本的具体情况去更新.
*
*/
if (newVersion == 3) {
db.execSQL(CREATE_TABLE_INCOME);
} else if (newVersion == 4) {
// 如果更新到版本4,之需要为一个表增加一个字段
db.execSQL("alter table income add column type Integer default 0");
}
}
3.之后我们便可以操作数据库的文件了.使用到的类SQLiteOpenHelper
操作的步骤:
1.打开数据库
2.往数据库中添加数据
3.再去对数据库中的文件进行查询/删除/更新
首先,我们定义了一个布局:
<TextView
android:id="@+id/main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnAdd"
style="?attr/buttonStyle"
android:text="添加数据!"/>
<ListView
android:id="@+id/mian_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在进行一些列的操作之前,我们先要建立数据库
public class MainActivity extends AppCompatActivity {
private TextView mText;
private SQLiteDatabase mDatabase;
private Cursor cursor;
private SimpleCursorAdapter mAdapter;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText = (TextView) findViewById(R.id.main_text);
listView = (ListView) findViewById(R.id.mian_list);
mDatabase = hepler.getWritableDatabase();
// 注意一定要是v4包下的
mAdapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,
cursor,
new String[]{DataContrents.Cost.MONEY},
new int[]{android.R.id.text1},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
);
listView.setAdapter(mAdapter);
}
查询:
public void requeyTCursor () {
cursor = mDatabase.query(DataContrents.Cost.TABLE_NAME,
null,
null,
null,
null,
null,
"money desc");
// CursorAdapter 有特定方法,可以直接切换Cursor, 直接关闭旧的Cursor,并且其内部会自动刷新
mAdapter.changeCursor(cursor);
}
增加:
public void btnAdd(View view) {
ContentValues values = new ContentValues();
values.put("money", 30.0);
values.put("type", 1);
values.put("use_time",12);
long numId = mDatabase.insert(DataContrents.Cost.TABLE_NAME, null, values);
// 继续查询,每次添加、修改、删除 都需要重新查询Cursor,设置到 ListView的Adapter上
requeyTCursor();
}
之后,我们可以点击添加就可以和插入数据并且显示了.
删除:
listView.setOnItemLongClickListener(this);
// 长按删除:
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
int deletei = mDatabase.delete(DataContrents.Cost.TABLE_NAME,
"_id = ?",
new String[]{Long.toString(id)});
if (deletei != -1) {
requeyTCursor();
}
// 如果这个地方返回false,那么还继续响应点击事件
return true;
}
更新:
ContentValues values = new ContentValues();
values.put("money", Double.parseDouble(money));
values.put("type", Integer.parseInt(mType));
database.update(DataContrents.Cost.TABLE_NAME,
values,
"_id = ?",
new String[] {Long.toString(id)}
);
在最后不要忘记关闭数据库:
关闭:
@Override
protected void onDestroy() {
// 不要搞错顺序
database.close();
database = null;
super.onDestroy();
}
注意
1. Android中隐含的规则:如果数据库的一条记录要显示到listView中,必须有一个主键,_id,如果没有_id,会抛出异常.
到这,数据库的简单使用就基本完成了,如果哪里有理解的和您不相符的地方,还请指出,期待共同探讨,谢谢..