亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

Android中數(shù)據(jù)庫的一些操作(增刪改查)

來源: w_l_s 發(fā)布時間:2018-11-30 17:39:49 閱讀量:1357

提起Android的開發(fā),就不得不提數(shù)據(jù)庫,幾乎每個App中都會用到Sqlit數(shù)據(jù)庫存儲一些數(shù)據(jù),小編閑暇時期,寫了一個小demo關(guān)于數(shù)據(jù)庫的增刪改查,之前也介紹過數(shù)據(jù)庫的一個開源框架ORMLite,在這里主要用到的是Android自帶的一些空間和屬性來實(shí)現(xiàn)的,話不多少,直接上代碼吧:


1、數(shù)據(jù)庫的創(chuàng)建:



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){

    /**

     * 創(chuàng)建數(shù)據(jù)庫

     * 參數(shù)一:數(shù)據(jù)庫名

     * 參數(shù)二:模式,一般為MOE_PRIVATE

     * 參數(shù)三:游標(biāo)工廠對象,一般寫null,表示系統(tǒng)自動提供

     */

    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);

    db.execSQL(CREATETABLE);

    db.close();

}

2、數(shù)據(jù)庫表的創(chuàng)建和數(shù)據(jù)的添加:


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);

    /**

     *插入數(shù)據(jù)

     * 參數(shù)一:要插入的表名

     * 參數(shù)二:要插入的空數(shù)據(jù)所在的行數(shù),第三個參數(shù)部位空,則此參數(shù)為null

     * 參數(shù)三:要插入的數(shù)據(jù)

     */

    db.insert(TABLENAME,null,values);

    ContentValues values1 = new ContentValues();

    values1.put("name","李四");

    values1.put("age",21);

    db.insert(TABLENAME,null,values1);

    db.close();

}

數(shù)據(jù)添加后的數(shù)據(jù)庫結(jié)構(gòu):



3、數(shù)據(jù)庫的更新:



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);

    /**

     * 數(shù)據(jù)的更新

     * 參數(shù)一:要更新的數(shù)據(jù)所在的表名

     * 參數(shù)二:新的數(shù)據(jù)

     * 參數(shù)三:要更新數(shù)據(jù)的查找條件

     * 參數(shù)四:條件的參數(shù)

     */

    db.update(TABLENAME,values,"_id=?",new String []{"2"});

    db.close();

}

數(shù)據(jù)更新后:



4、數(shù)據(jù)的查找:



public void queryData(View view){

    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);

    //查詢部分?jǐn)?shù)據(jù)

    Cursor cursor = db.rawQuery("select * from " + TABLENAME + "where name=?",new String []{"張三"});

    //查詢?nèi)繑?shù)據(jù)

    Cursor cursor1 = db.rawQuery("select * from " + TABLENAME ,null);

    //將游標(biāo)移到第一行

    cursor1.moveToFirst();

    //循環(huán)讀取數(shù)據(jù)

    while(!cursor1.isAfterLast()){

        //獲得當(dāng)前行的標(biāo)簽

        int nameIndex = cursor1.getColumnIndex("name");

        //獲得對應(yīng)的數(shù)據(jù)

        String name = cursor1.getString(nameIndex);

        int ageIndex = cursor1.getColumnIndex("age");

        int age = cursor1.getInt(ageIndex);

        Log.d(TAG, "name:"+ name +"age: "+age);

        //游標(biāo)移到下一行

        cursor1.moveToNext();

    }

    db.close();

}

查詢的結(jié)果:



5、數(shù)據(jù)的刪除:



public void delectData(View view){

    SQLiteDatabase db = this.openOrCreateDatabase("text.db",MODE_PRIVATE,null);

    //要刪除的數(shù)據(jù)

    db.delete(TABLENAME,"name = ?",new String[]{"趙四"});

    db.close();

}

數(shù)據(jù)刪除后:






SqliteOpenHelper的用法:

該類的方法:

1、getReadableDatabase() 創(chuàng)建或者打開一個可讀寫的數(shù)據(jù)庫,如果出現(xiàn)問題(磁盤滿等),則打開一個只讀的數(shù)據(jù)庫。


2、getWritableDatabase() 獲得一個可讀寫的數(shù)據(jù)庫。如果磁盤滿則會拋異常。


3、onCreate(SQLiteDatabase db) 只有第一次創(chuàng)建這個數(shù)據(jù)庫的時候調(diào)用。一般在這個方法中創(chuàng)建數(shù)據(jù)的相應(yīng)表。


4、onOpen(SQLiteDatabase db) 當(dāng)每次打開數(shù)據(jù)庫的時候都會調(diào)用。這個方法很少使用


5、onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 當(dāng)升級數(shù)據(jù)庫即數(shù)據(jù)庫的版本號發(fā)生改變的時候調(diào)用,一般如果需要修改表結(jié)構(gòu)就寫在這里.


//db.execSQL(“alert 表名 add 列名列數(shù)據(jù)類型”);


6、close()   關(guān)閉打開的所有數(shù)據(jù)庫對象


使用步驟:

創(chuàng)建SQLiteOpenHelper類的子類MySQLiteOpenHelper 類,實(shí)現(xiàn)SQLiteOpenHelper類中的抽象方法onCreate()和onUpgrade();

調(diào)用 MySQLiteOpenHelper 對象的getWritableDatabase 或 getReadableDatabase方法,獲得SQLiteDatabase 對象;

創(chuàng)建表。

調(diào)用SQLiteDatabase 對象的execSQL()方法,執(zhí)行 update,insert,delete操作;調(diào)用rawQuery()方法執(zhí)行select查詢操作;

如果執(zhí)行的是查詢操作,則對返回的Cursor進(jìn)一步處理。

示列:

布局:

 <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="添加數(shù)據(jù)"

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="插入數(shù)據(jù)"/>


    <item

android:id="@+id/delete_item"

app:showAsAction="never"

android:title="刪除數(shù)據(jù)"/>

    <item

android:id="@+id/update_item"

app:showAsAction="never"

android:title="修改數(shù)據(jù)"/>

</menu>

Student實(shí)例:

 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)";

//構(gòu)造方法,系統(tǒng)會自動創(chuàng)建數(shù)據(jù)庫文件

public MyOpenHlper(Context context,String name,int version){

super(context,name,null,version);

}

//只有在第一次打開數(shù)據(jù)庫的時候調(diào)用

@Override

public void onCreate(SQLiteDatabase db) {

        db.execSQL(CREATETABLE);

}



//當(dāng)數(shù)據(jù)庫的版本發(fā)生變化的時候調(diào)用

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//更新表結(jié)構(gòu)或刪除舊的表結(jié)構(gòu)

db.execSQL("DROP TABLE IF EXISTS "+TABALENAME);

onCreate(db);

}

}

主函數(shù):

 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) ;


參數(shù):


1)、Context context, 這個與 SimpleListItemFactory 相關(guān)的 ListView 所處運(yùn)行上下文(context)。也就是這個 ListView 所在的 Activity。


 


2)、int layout, 顯示 list item 的 布局文件。這個 layout 文件中至少要包含在 "to" 參數(shù)中命名的 views。


 


3)、Cursor c, 數(shù)據(jù)庫的光標(biāo)( Cursor )。如果 cursor 無效,則該參數(shù)可以為 null


 


4)、String[] from, 指定 column 中的哪些列的數(shù)據(jù)將綁定(顯示)到 UI 中。如果 cursor 無效, 則該參數(shù)可為 null。


 


5)、int[] to, 指定用于顯示 "from" 參數(shù)指定的數(shù)據(jù)列表的 views。 這些 views 必須都是 TextViews。 "from" 參數(shù)的前 N 個值(valus)和 "to" 參數(shù)的前 N 個 views 是一一對應(yīng)的關(guān)系。如果 cursor 無效,則該參數(shù)可為 null。


 


6)、flags,用于定義適配器行為的標(biāo)志位。


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 開始已經(jīng)廢棄。因為他會在應(yīng)用程序的 UI 線程中執(zhí)行Cursor查詢操作, 導(dǎo)致響應(yīng)緩慢甚至應(yīng)用程序停止響應(yīng)(ANR)application not response的錯誤。作為替代方案,請使用 LoaderManager 和 CursorLoader. 


如果設(shè)置FLAG_REGISTER_CONTENT_OBSERVER(常量值:2),適配器會在Cursor上注冊一個Observer,當(dāng)通知到達(dá)時會調(diào)用 onContentChanged() 方法。


效果圖:


--------------------- 



標(biāo)簽: 數(shù)據(jù)庫
分享:
評論:
你還沒有登錄,請先