【Sqlite+Kotlin】學生管理

1.基礎知識

  1. 這個MVVM框架我憑感覺亂寫的
  2. 導包一直出錯,報support-v4什麼的,問題很大,後來改用 AndroidStdio新建項目
  3. 之後在app外gradle中添加maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }就好了

在這裏插入圖片描述

2. 數據庫設計

1.創建數據庫幫助類並初始化

1)kotlin的寫法,前面那個是初始化主構造器的參數,後面繼承寫的參數是主構造器調用的父類傳入參數(相當於java的super)

class StudentbaseHelpter(context: Context?) :
    SQLiteOpenHelper(context,Constants.DATABASE_NAME,null, Constants.VERSIONCODE) {
    override fun onCreate(db: SQLiteDatabase?) {
        db?.execSQL("create table studentinfo(_id integer,name varchar,sno varchar,class varchar,grade int)")
    }

2)建立Model包,新建Contracts類,並創建伴生對象,包含數據庫所用信息,供Helpter類使用
3)來到主AC,新建學生幫助類對象,並且完成學生數據庫的初始化創建
在這裏插入圖片描述

2.完善學生類增刪改查

  1. 改寫插入數據
    1)改寫
    2)測試調用可以,主要這邊主構造器獲取的context,var出來供Helpter對象聲明
    fun insert(sid :Int,sname:String,sno:String,sclass:String,sgrade:Int) {
        mhelper = StudentbaseHelpter(appContext)
        //寫入
        val db = mhelper?.getWritableDatabase()//獲取到數據庫後對錶進行查找

       /* val sql =
            "insert into studentinfo(_id,name,sno,class,grade) values(?,?,?,?,?)"
            db?.execSQL(sql, arrayOf(1, "Kirika", "18", "1",80))*/
        val values = ContentValues()//接着添加數據
        values.put("_id", sid)
        values.put("name",sname)
        values.put("sno", sno)
        values.put("class", sclass)
        values.put("grade", sgrade)
        db?.insert(Constants.TABLE_SNAME, null, values)//二參數是可否爲空字段  三參數是填充內容 hashMap結構
        db?.close()//關閉相關引用
    }

在這裏插入圖片描述
2. 修改刪除,sql和以前一樣,多個?應該可以多條件

    fun deletebyid(sid: Int) {
        mhelper = StudentbaseHelpter(appContext)
        val db = mhelper?.getWritableDatabase()//獲取到數據庫後對錶進行查找
        /*var sql:String="delete from "+Constants.TABLE_SNAME+ " where _id="+sid
        db?.execSQL(sql);*/
        db?.delete(Constants.TABLE_SNAME, "_id=?", arrayOf(sid.toString()));

        db?.close()//關閉相關引用
    }

3.新建管理員數據庫,用於登錄

  1. 在Hlepter類的主構造器建立數據庫,oncreate()中初始化即可

在這裏插入圖片描述
2. 準備登錄註冊的方法,寫跳轉的時候發現anko庫添加會報錯v4.。。神奇目前解決不了
在這裏插入圖片描述

整理結構

1.導包

調整好導包失敗的原因後,導入anko,bottombar,cardview包

2.建立Base包,添加BaseActivity和BaseFragment

  1. 內容見Frawayplayer,將原放在oncreate中的內容做抽取,層次更明確,且規範子類的運

3.登錄界面完成數據庫的初始化後進入MAC界面

  1. 返回一個界面佈局
  2. 兩個數據庫的初始化(initDate)
  3. initlistener的登錄跳轉

4.添加BottomBar

  1. 複製GithubBottomBar樣例,LinearLayout下一個Fragment,一個BottomBar(要指定組件來源)
  2. 寫個xml文件,整個<tab組件加入BottomBar
  3. 運行就有底部欄了

4.5設置BottomBar監聽

  1. 準備一個FragmentUtil類來切換對應點擊
  2. 思路是準備多個Fragment進行點擊和返回對應的切換
  3. 設置點擊監聽,返回對應的Fragement佈局進行替換
    override fun initListener() {
        bottomBar.setOnTabSelectListener{
            // it代表參數id
            val transaction = supportFragmentManager.beginTransaction()
            //將當前container替換爲第二個參數由FragmentUtil獲取
            transaction.replace(R.id.container, FragmentUtil.fragmentUtil.getFragment(it),it.toString())//it後需要一個tag
            transaction.commit()
        }

    }

5.設置ToolBar

  1. 先設置主題爲noActionBar
  2. 添加自定義toolba.xml文件
    1)設置前景,背景色
    2)在MAC界面Fragment上include引入該佈局
  3. 添加一個接口工具類來設置ToolBar上顯示的東西,MAC實現接口,並且惰性加載一個對象,在initData中實現該初始化賦值方法

6.Home主頁與RecycleView

  1. Home頁面對應的Fragment中加入一個下拉刷新和RecycleView
  2. 來到HomeFragment中首先初始化layout,獲取當前context
  3. 建立對應HomeAdapter類,獲取適配的adapter結構,將其值給RecycleView即可
    1)建立adapter
    a. 創建homeholder獲取對應View
    b. 複寫三個方法,綁定數據的方法爲子項賦值的方法,可以不寫,返回數據的先來個20條,nCreateViewHolder用於返回每條的數據,這裏採用一個Widget方式建立HomeItemView,返回HomeHolder(HomeItemView(parent?.context))
    2)建立HomeItemVIew,指定複寫的構造方法和佈局即可
   //複寫三個次級構造方法
    //代碼new相關
    constructor(context: Context?) : super(context)
    //清單文件相關
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    //主題相關
    constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle)
/*初始化方法 調用主,次構造方法都會執行
下面階段的inflate方法傳入一個xml文件進行調用
* */

    init {
    //this 當前的xml文件解析爲view傳過去 填null則應寫addview
        View.inflate(context,R.layout.item_home,this)
    }

//這個是完成後的HF適配

    override fun initListener() {
        //2.1初始化layout的 recycler_view1
        recycler_view1.layoutManager = LinearLayoutManager(context)
        //適配 調用HomeAdapter
        val adapter=HomeAdapter()
        recycler_view1.adapter = adapter
//        谷歌自帶的刷新效果默認有點醜 初始化刷新控件
        refreshLayout.setColorSchemeColors(Color.RED, Color.YELLOW, Color.GREEN)
        //2.2設置刷新監聽
//        可選1.內部只有一個方法 直接打開 2.和之前一樣傳一個匿名內部類

    }

在這裏插入圖片描述

  1. 具體HomeFragment進行主頁數據的裝載
    1)複寫initdate()方法,寫個獲取數據的方法loadDates()調用獲取數據【數據庫查詢靜態操作放在這裏
    2)複寫initlistener方法,用於初始recycleview,因爲這個是動態的
    a.指定佈局中的RelativeLayout爲LingerLayout
    b. 創建一個adapter給他即可,一切監聽有adapter實現,來到adapter
    b1)getItemCount返回20條記錄
    b2)onCreateViewHolder,返回創建的條目信息即可
  2. 信息的裝載【調用方法,拿到list】,adapter中對應寫一個方法,updatelist中轉,給每個條目設置即可
    1)代碼1,adapter更新方法
    private var list=ArrayList<StudentBean>()//用裏面的list匿名內部類
  //在集合中先清空  再添加
    fun updateList(list: List<StudentBean>){//傳入一個對應集合 到時候側試一下傳原lei還是內部類
        this.list.clear()
        this.list.addAll(list)//牛逼
        notifyDataSetChanged()//刷新一下
    }

2)代碼2,onBindView根據自動position和list綁定更新,更新來到調用條目view

    override fun onBindViewHolder(holder: HomeHolder, position: Int) {
    //能顯示幾條後再進行數據綁定
        //如果是最後一條就不刷新view
        if(position==list.size)
            return
        //1.拿到條目數據
        val data=list.get(position)
        //2.拿到條目View
        val itemView=holder.itemView as HomeItemView
        //3.條目刷新
        itemView.setDate(data)
}

3)代碼3,條目view更新

/*刷新條目view數據*/
    fun setDate(data: StudentBean) {
        sid.setText(data.get_id().toString())
        name.setText(data.getname())
        sno.setText(data.getsno())
        stclass.setText(data.getstclass())
        grade.setText(data.getgrade().toString())
    }

7.其他增刪改查,佈局和界面都不贅述了,下面是圖片展示【成功後加個toast記錄】

傳送實現樣例

  1. 查詢信息首頁
    在這裏插入圖片描述

  2. 添加學生
    在這裏插入圖片描述

  3. 根據id刪除學生信
    在這裏插入圖片描述

  4. 修改學生信息
    在這裏插入圖片描述

  5. 兩個數據庫
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章