Java安卓开发之SQLiteDatabase下(通俗易懂版)——第7章

本期,我们将ListView和SQL相适配,并且添加一个页面便于添加数据


TheThirdActivity:

        由于本期主题是数据库的应用,所以我就跳过说明如何创建活动部分,XML代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="20dp"
>
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="20dp"
            android:orientation="vertical"
            android:gravity="center"
    >
        <EditText android:layout_width="match_parent"
                  android:layout_height="50dp"
                  android:hint="请输入姓名"
                  android:textColorHint="@color/black"
                  android:id="@+id/edt_1"
                  android:inputType="text"
                  />
        <EditText android:layout_width="match_parent"
                  android:layout_height="50dp"
                  android:hint="请输入年龄"
                  android:textColorHint="@color/black"
                  android:id="@+id/edt_2"
                  android:inputType="number"
        />
    </LinearLayout>
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="提交"
            android:id="@+id/btn_1"
            />
    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="返回"
            android:id="@+id/btn_2"
    />
</LinearLayout>

        对于添加数据类型的活动,思路就是:按下按钮,获取用户输入数据,添加数据库,调用组件告诉用户已完成。 

       Java文件代码也跳过(作者个人认为不难,如需要私信作者将这一块详细描述下),代码如下:

        

package com.example.app;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.Nullable;

public class ThirdActivity extends Activity {
    private EditText editText1;
    private EditText editText2;
    private Button button1;
    private Button button2;
    private Data data ;
    private SQL sql ;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.third_activity);
        editText1 = findViewById(R.id.edt_1);
        editText2 = findViewById(R.id.edt_2);
        button1 = findViewById(R.id.btn_1);
        button2 = findViewById(R.id.btn_2);
        data = new Data();
        sql = new SQL(this);

        button1.setOnClickListener( view -> {
            data.setData(editText1.getText().toString() ,
                   Integer.parseInt(editText2.getText().toString()) );
            sql.insert(data);
            Tool.callAlertBuilder(this,"系统提示" , "添加成功" ).show();
        } );
        
        button2.setOnClickListener(view -> finish());

    }
}

         请读者注意不要忘记在manifest登记这个活动,并在主页面新添加个按钮以便于跳转进来。

AndroidManifest.xml:

        <activity
                android:name=".ThirdActivity"
                android:exported="true">
            
        </activity>

 然后,我们添加的活动板块就完成了!


ListView显示SQL数据:

        在这之前,让我们先把之前写的代码优化一下:

public static ArrayList<Data> arrayList = new ArrayList<>() ;

        Data data = new Data();
        data.setData("李晓明" , 14);
        arrayList.add(data);
        /*
        Map<String,Object> map = Map.of("姓名", "李晓明"
                , "年龄","14");
        arrayList.add(map);
         */
        Data data2 = new Data();
        data2.setData("王梦" , 15);
        arrayList.add(data2);
        /*
        Map<String,Object> map2 = Map.of("姓名","王梦"
                , "年龄","15");
        arrayList.add(map2);
         */

 由于SimpleAdapter只支持map,不然会报错:

'android.widget.SimpleAdapter' 中的 'SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, java.lang.String[], int[])' 无法应用于 '(com.example.app.SecondActivity, java.util.ArrayList<com.example.app.Data>, int, java.lang.String[], int[])'

因此我们有两种方案:1,覆写Adapter ,2,把Data转成Map ,这里我想用第二种方法,简单一点,若读者需要第一种,可在评论区留言扣1,作者收到后会立即更新第一种方案

考虑到后续可能会再次用到Data转Map因此我们直接在Tool类写个辅助方法:

public static ArrayList<Map<String , String>> arrDataToMap(ArrayList<Data> datas){
        ArrayList<Map<String , String>> maps = new ArrayList<>();
        for ( Data data : datas ){
            Map map = new HashMap();
            map.put("姓名", data.getName());
            map.put("年龄", String.valueOf(data.getAge())  );
            maps.add(map);
        }
        return maps;
    }

        这里会存在俩易错点

  1. data.getAge()不是实参,无法使用.toString()
  2. SimpleAdapter中需要的是Map<String , Object > 所以必须要用泛类修饰Map

之后我们在SecondActivity中把ArrayList替换成 Tool.arrDataToMap(arrayList):

         adapter = new SimpleAdapter(this
                ,Tool.arrDataToMap(arrayList)
                ,R.layout.list_view1
                ,resName
                ,resId );
        listView1.setAdapter(adapter);
        listView1.setOnItemClickListener((parent, view, position, id) -> {
            Map getMap = Tool.arrDataToMap(arrayList).get(position);
            Tool.callAlertBuilder(this ,"列表显示" ,getMap.toString())
                    .setPositiveButton("确定", (dialog, which) -> { })
                    .setCancelable(true)
                    .show();
        });

        运行一下看看:

 

        发现替换后程序仍能正常运行,所以我们就可以直接把这俩非数据库的数据删除了!

        回到SecondActivity,实例化一个SQL对象sql ,把arrayList替换成sql.queryAll() ,删除之前手动添加的数据:

protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);

        sql  = new SQL(this);

        button1 = findViewById(R.id.button1);
        button1.setOnClickListener(view -> finish());

        listView1 = findViewById(R.id.list_view1);
        adapter = new SimpleAdapter(this
                ,Tool.arrDataToMap(sql.queryAll())
                ,R.layout.list_view1
                ,resName
                ,resId );
        listView1.setAdapter(adapter);
        listView1.setOnItemClickListener((parent, view, position, id) -> {
            Map getMap = Tool.arrDataToMap(sql.queryAll()).get(position);
            Tool.callAlertBuilder(this ,"列表显示" ,getMap.toString())
                    .setPositiveButton("确定", (dialog, which) -> { })
                    .setCancelable(true)
                    .show();
        });
    }

 到此,所有东西都开发完毕,下一期开始Fragment ,注意,我们即将步入业余选手阶段,会逐渐跟更高级的东西接轨,不懂的一定要问,不然漏掉的很有可能是最重要的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Автомата Калашникова

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值