Android中数据库的一些操作(增删改查)
提起Android的開發,就不得不提數據庫,幾乎每個App中都會用到Sqlit數據庫存儲一些數據,小編閑暇時期,寫了一個小demo關于數據庫的增刪改查,之前也介紹過數據庫的一個開源框架ORMLite,在這里主要用到的是Android自帶的一些空間和屬性來實現的,話不多少,直接上代碼吧:
1、數據庫的創建:
private static final String TABLENAME = "student";
private static final String CREATETABLE = "CREATE TABLE " + TABLENAME +
? ? ? ? "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)";
public void creatTable(View view){
? ? /**
? ? ?* 創建數據庫
? ? ?* 參數一:數據庫名
? ? ?* 參數二:模式,一般為MOE_PRIVATE
? ? ?* 參數三:游標工廠對象,一般寫null,表示系統自動提供
? ? ?*/
? ? SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
? ? db.execSQL(CREATETABLE);
? ? db.close();
}
2、數據庫表的創建和數據的添加:
public void insertData(View view){
? ? SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
? ? ContentValues values = new ContentValues();
? ? values.put("name","張三");
? ? values.put("age",18);
? ? /**
? ? ?*插入數據
? ? ?* 參數一:要插入的表名
? ? ?* 參數二:要插入的空數據所在的行數,第三個參數部位空,則此參數為null
? ? ?* 參數三:要插入的數據
? ? ?*/
? ? db.insert(TABLENAME,null,values);
? ? ContentValues values1 = new ContentValues();
? ? values1.put("name","李四");
? ? values1.put("age",21);
? ? db.insert(TABLENAME,null,values1);
? ? db.close();
}
數據添加后的數據庫結構:
3、數據庫的更新:
public void updateData(View view){
? ? SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
? ? ContentValues values = new ContentValues();
? ? values.put("name","趙四");
? ? values.put("age",43);
? ? /**
? ? ?* 數據的更新
? ? ?* 參數一:要更新的數據所在的表名
? ? ?* 參數二:新的數據
? ? ?* 參數三:要更新數據的查找條件
? ? ?* 參數四:條件的參數
? ? ?*/
? ? db.update(TABLENAME,values,"_id=?",new String []{"2"});
? ? db.close();
}
數據更新后:
4、數據的查找:
public void queryData(View view){
? ? SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
? ? //查詢部分數據
? ? Cursor cursor = db.rawQuery("select * from " + TABLENAME + "where name=?",new String []{"張三"});
? ? //查詢全部數據
? ? Cursor cursor1 = db.rawQuery("select * from " + TABLENAME ,null);
? ? //將游標移到第一行
? ? cursor1.moveToFirst();
? ? //循環讀取數據
? ? while(!cursor1.isAfterLast()){
? ? ? ? //獲得當前行的標簽
? ? ? ? int nameIndex = cursor1.getColumnIndex("name");
? ? ? ? //獲得對應的數據
? ? ? ? String name = cursor1.getString(nameIndex);
? ? ? ? int ageIndex = cursor1.getColumnIndex("age");
? ? ? ? int age = cursor1.getInt(ageIndex);
? ? ? ? Log.d(TAG, "name:"+ name +"age: "+age);
? ? ? ? //游標移到下一行
? ? ? ? cursor1.moveToNext();
? ? }
? ? db.close();
}
查詢的結果:
5、數據的刪除:
public void delectData(View view){
? ? SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);
? ? //要刪除的數據
? ? db.delete(TABLENAME,"name = ?",new String[]{"趙四"});
? ? db.close();
}
數據刪除后:
SqliteOpenHelper的用法:
該類的方法:
1、getReadableDatabase()?創建或者打開一個可讀寫的數據庫,如果出現問題(磁盤滿等),則打開一個只讀的數據庫。
2、getWritableDatabase()?獲得一個可讀寫的數據庫。如果磁盤滿則會拋異常。
3、onCreate(SQLiteDatabase db)?只有第一次創建這個數據庫的時候調用。一般在這個方法中創建數據的相應表。
4、onOpen(SQLiteDatabase db)?當每次打開數據庫的時候都會調用。這個方法很少使用
5、onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)?當升級數據庫即數據庫的版本號發生改變的時候調用,一般如果需要修改表結構就寫在這里.
//db.execSQL(“alert?表名?add?列名列數據類型”);
6、close()???關閉打開的所有數據庫對象
使用步驟:
創建SQLiteOpenHelper類的子類MySQLiteOpenHelper?類,實現SQLiteOpenHelper類中的抽象方法onCreate()和onUpgrade();
調用?MySQLiteOpenHelper?對象的getWritableDatabase?或?getReadableDatabase方法,獲得SQLiteDatabase?對象;
創建表。
調用SQLiteDatabase?對象的execSQL()方法,執行?update,insert,delete操作;調用rawQuery()方法執行select查詢操作;
如果執行的是查詢操作,則對返回的Cursor進一步處理。
示列:
布局:
?<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
? ? <ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/button"/>
? ? <Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加數據"
android:onClick="btnClick"/>
</RelativeLayout>
菜單Menu:
?<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
? ? <item
android:id="@+id/insert_item"
app:showAsAction="never"
android:title="插入數據"/>
? ? <item
android:id="@+id/delete_item"
app:showAsAction="never"
android:title="刪除數據"/>
? ? <item
android:id="@+id/update_item"
app:showAsAction="never"
android:title="修改數據"/>
</menu>
Student實例:
?public class StudentEntity {
private String name;
? ? private Integer age;
? ? public StudentEntity() {
? ? }
public StudentEntity(String name, Integer age) {
this.name = name;
? ? ? ? this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "StudentEntity{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
SQLiteOpenHelper類的子類:
?public class MyOpenHlper extends SQLiteOpenHelper{
private static final String TABALENAME = "student";
? ? private static final String CREATETABLE = "CREATE TABLE " + TABALENAME
+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, age INTEGER)";
//構造方法,系統會自動創建數據庫文件
public MyOpenHlper(Context context,String name,int version){
super(context,name,null,version);
}
//只有在第一次打開數據庫的時候調用
@Override
public void onCreate(SQLiteDatabase db) {
? ? ? ? db.execSQL(CREATETABLE);
}
//當數據庫的版本發生變化的時候調用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//更新表結構或刪除舊的表結構
db.execSQL("DROP TABLE IF EXISTS "+TABALENAME);
onCreate(db);
}
}
主函數:
?public class MySqlite extends MainActivity{
private static final String TABALENAME = "student";
? ? private ListView mListView;
? ? private List<StudentEntity> mList;
? ? private MyOpenHlper myOpenHlper;
? ? private SQLiteDatabase db;
? ? private Cursor mCursor;
? ? private SimpleCursorAdapter adapter;
? ? private int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mysqlite);
init();
downLoadData();
}
public void init(){
mListView = (ListView) findViewById(R.id.listView);
mList = new ArrayList<>();
myOpenHlper = new MyOpenHlper(this,"test.db",2);
db = myOpenHlper.getWritableDatabase();
mCursor = db.rawQuery("select * from "+TABALENAME,null);
adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, mCursor,
? ? ? ? ? ? ? ? new String[]{"name","age"},
? ? ? ? ? ? ? ? new int[]{android.R.id.text1,android.R.id.text2},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
mListView.setAdapter(adapter);
}
public void downLoadData(){
mList.add(new StudentEntity("張三",12));
mList.add(new StudentEntity("李四",15));
mList.add(new StudentEntity("王五",18));
mList.add(new StudentEntity("趙六",22));
mList.add(new StudentEntity("麻子", 25));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
? ? ? ? getMenuInflater().inflate(R.menu.main,menu);
? ? ? ? return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
? ? ? ? if(id == R.id.insert_item){
if(index<mList.size()){
? ? ? ? ? ? ? ? ContentValues values = new ContentValues();
values.put("name",mList.get(index).getName());
values.put("age",mList.get(index).getAge());
db.insert(TABALENAME,null,values);
mCursor = db.rawQuery("select * from "+TABALENAME,null);
adapter.swapCursor(mCursor);
index++;
}
? ? ? ? }
return true;
}
/* ?public void btnClick(View view){
? ? ? ? if(index<mList.size()){
? ? ? ? ? ? ContentValues values = new ContentValues();
? ? ? ? ? ? values.put("name",mList.get(index).getName());
? ? ? ? ? ? values.put("age",mList.get(index).getAge());
? ? ? ? ? ? db.insert(TABALENAME,null,values);
? ? ? ? ? ? mCursor = db.rawQuery("select * from "+TABALENAME,null);
? ? ? ? ? ? adapter.swapCursor(mCursor);
? ? ? ? ? ? index++;
? ? ? ? }
? ? }*/
}
其中:SimpleCursorAdapter是CursorAdapter的子類,
使用方式與SimpleAdapter類似
原型:
new SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to , int flags) ;
參數:
1)、Context context,?這個與?SimpleListItemFactory?相關的?ListView?所處運行上下文(context)。也就是這個?ListView?所在的?Activity。
?
2)、int layout,?顯示?list item?的 布局文件。這個?layout?文件中至少要包含在?"to"?參數中命名的?views。
?
3)、Cursor c,?數據庫的光標( Cursor )。如果?cursor?無效,則該參數可以為?null
?
4)、String[] from,?指定?column?中的哪些列的數據將綁定(顯示)到?UI?中。如果?cursor?無效, 則該參數可為?null。
?
5)、int[] to,?指定用于顯示?"from"?參數指定的數據列表的?views。 這些?views?必須都是?TextViews。?"from"?參數的前?N?個值(valus)和?"to"?參數的前?N?個?views?是一一對應的關系。如果?cursor?無效,則該參數可為?null。
?
6)、flags,用于定義適配器行為的標志位。
Flags used to determine the behavior of the adapter; may be any combination of?FLAG_AUTO_REQUERY?and?FLAG_REGISTER_CONTENT_OBSERVER。
?
?FLAG_AUTO_REQUERY(常量值:1?)從?API11?開始已經廢棄。因為他會在應用程序的?UI?線程中執行Cursor查詢操作, 導致響應緩慢甚至應用程序停止響應(ANR)application not response的錯誤。作為替代方案,請使用?LoaderManager?和?CursorLoader.?
如果設置FLAG_REGISTER_CONTENT_OBSERVER(常量值:2),適配器會在Cursor上注冊一個Observer,當通知到達時會調用?onContentChanged()?方法。
效果圖:
原文:https://blog.csdn.net/w_l_s/article/details/62232768?
?
總結
以上是生活随笔為你收集整理的Android中数据库的一些操作(增删改查)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android SharedPrefer
- 下一篇: android sina oauth2.