Android更新之生词本的实现(Sqlite+SQL语句)

这篇博客介绍了如何在Android中实现一个简单的生词本应用。从点击gridView跳转到生词本,到实现数据库操作,包括创建表、插入数据、模糊查询,最后展示查询结果。使用SQLite数据库,通过接口回调处理点击事件,动态更新视图,并在ResultActivity中展示搜索结果。
摘要由CSDN通过智能技术生成

生词本的实现:

接着上次的gridview视图,现在实现第一个demo生词本:

在这里插入图片描述
点击生词本:

在这里插入图片描述
插入多个单词数据后实现查询效果,输入单词或者解释的部分即可查询(由于模拟器没有中文键盘,所以测试数据我全用的英文,简单模拟以下):

在这里插入图片描述好了下面开始介绍实现这些简单界面的逻辑代码:

(这一步还是在上一篇实现gridView的项目里,参照上一篇博客)
首先在grid适配器中定义一个点击接口,activity判断点击了哪个子项,并实现跳转,适配器中:

interface ClickListemer{
        void onclck(String s1);
    }//定义接口
    ClickListemer Listemer;
    public void setClickListener(ClickListemer s)//传入外界实现的接口对象
    {
        Listemer=s;
    }

在适配器getView方法中实现视图的点击事件,并给更新的接口传递当前子项的名称:

public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        //首先通过下面的if/else获取到了装入了正在显示的第position个view的两个控件的ViewHolder
        //再给holder更新视图
        if(convertView==null)
        {
            holder=new ViewHolder();
            convertView= LayoutInflater.from(context).inflate(R.layout.grid_laoutunit,null);
            holder.titleview=(ImageView) convertView.findViewById(R.id.title_view);
            holder.title=(TextView) convertView.findViewById(R.id.text_title);
            convertView.setTag(holder);
        }
        else
        {
            holder= (ViewHolder) convertView.getTag();
        }
        final GridviewEntity entity=list.get(position);
        holder.titleview.setImageResource(entity.getDrawrouse());
        holder.title.setText(entity.getTitle());
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Listemer.onclck(entity.getTitle());//回调参数
            }
        });

        return convertView;
    }

在activity中实现适配器的setClickListener方法并传入一个接口实例,获取到回调参数:

 GridviewAdapter adapter=new GridviewAdapter(this);
        adapter.setClickListener(new GridviewAdapter.ClickListemer() {
            @Override
            public void onclck(String s1) {
                if(s1.equals("生词本"))
                {
                    startActivity(new Intent(SecondActivity.this, WordActivity.class));
                }
            }
        });
        grid_laout.setAdapter(adapter);

现在实现了跳转到生词本的activity,下图为demo结构:
在这里插入图片描述
首先我先列出会待会使用到的SQL语句(对于语法就不赘述了):

//创建表,_id自动增长,word,detail默认为string
    "create table dic(_id integer primary key autoincrement,word,detail)"
    //插入元素
    "insert into dic values(null,?,?)"
    //模糊匹配
    "select * from dic where word like ? or detail like ?"

下面展示接口类的内容(这里只写了两个String):

package com.example.studyapp.word;

public class Wordinterface {
    public static final String TABLENAME="dic";
    public static final String SQLITENAME="myDict.db";
}

现在创建myDataBaseHelper继承dataBaseHelper实现数据库的建立:

package com.example.studyapp.word;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.core.view.accessibility.AccessibilityViewCommand;

public class myDataBaseHelper extends SQLiteOpenHelper {
    public myDataBaseHelper(@Nullable Context context, @Nullable String name, int version) {
        super(context, name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建表
        String sql="create table dic(_id integer primary key autoincrement,word,detail)";
        db.execSQL(sql);
    }

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

    }
}

下面实现单词本的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_height="match_parent"
    android:background="@mipmap/dancibak"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent">
<EditText
    android:layout_marginTop="35dp"
    android:id="@+id/edt_word"
    android:hint="请输入单词"
    android:textSize="20dp"
    android:layout_marginRight="30dp"
    android:layout_marginLeft="20dp"
    android:background="@drawable/editlayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
    <EditText
        android:layout_below="@id/edt_word"
        android:id="@+id/edt_Detial"
        android:layout_marginTop="20dp"
        android:hint="请输入解释"
        android:textSize="20dp"
        android:layout_marginRight="30dp"
        android:layout_marginLeft="20dp"
        android:background="@drawable/editlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
<Button
    android:id="@+id/btn_insert"
    android:text="插入"
    android:textSize="28dp"
    android:layout_marginTop="30dp"
    android:layout_centerHorizontal="true"
    android:layout_below="@id/edt_Detial"
    android:background="@drawable/btnlayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
    <EditText
        android:layout_below="@id/btn_insert"
        android:id="@+id/edt_search_text"
        android:layout_marginTop="20dp"
        android:hint="请输入要查询的单词或中文解释"
        android:textSize="20dp"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:background="@drawable/editlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btn_search"
        android:text="查询"
        android:textSize="28dp"
        android:layout_marginTop="30dp"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/edt_search_text"
        android:background="@drawable/btnlayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>

继续实现activity的代码,在此代码中,实现控件的逻辑操作以及数据库的逻辑操作,同时当点击查询时,将查询到的cursor转换成list集合并封装成Bundle传递给Intent,让跳转的activity显示搜索到的内容(这里数据库搜索当中,实现了一个模糊查询,不得不感概SQL语句的强大,如果有不懂的地方建议关键词搜索相关资料):

package com.example.studyapp.word;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.studyapp.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class WordActivity extends AppCompatActivity {
    private Button btnInsert;
    private Button btnSearch;
    private EditText edtword;
    private EditText edtDetail;
    private EditText edtsearchText;
    myDataBaseHelper myDataBaseHelper;//数据库
    SQLiteDatabase mDatabase;//读写base
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_word);
        init();
    }

    private void init() {
    btnInsert=findViewById(R.id.btn_insert);
    btnSearch=findViewById(R.id.btn_search);
    edtword=findViewById(R.id.edt_word);
    edtsearchText=findViewById(R.id.edt_search_text);
    edtDetail=findViewById(R.id.edt_Detial);
    myDataBaseHelper=new myDataBaseHelper(this,Wordinterface.SQLITENAME,1);
    mDatabase=myDataBaseHelper.getWritableDatabase();
    btnInsert.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        String sql="insert into dic values(null,?,?)";
        mDatabase.execSQL(sql,new String[]{edtword.getText().toString(),edtDetail.getText().toString()});
            Toast.makeText(WordActivity.this,"数据添加成功",Toast.LENGTH_SHORT).show();
        }
    });
    btnSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(edtsearchText==null)
            {
                Toast.makeText(WordActivity.this,"查询的内容不能为空!",Toast.LENGTH_SHORT).show();
                return;
            }
            else
            {
                String sql="select * from dic where word like ? or detail like ?";
                //string两个成员分别对应两个? 进行模糊匹配
                Cursor cursor = mDatabase.rawQuery(sql, new String[]{"%" + edtsearchText.getText().toString() + "%",
                        "%" + edtsearchText.getText().toString() + "%"});
                ArrayList<Map<String, String>> changecursortolist = changecursortolist(cursor);
                Bundle bundle=new Bundle();
                //因为intent不能直接传送list集合,所以把list封装在Bundle中(将list序列化)
                bundle.putSerializable("data",changecursortolist);
                Intent intent=new Intent(WordActivity.this,ResultActivity.class);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        }
    });
    }
    //将cursor指向的所有数据添加到list中去
    private ArrayList<Map<String,String>> changecursortolist(Cursor cursor) {
        ArrayList<Map<String,String>> result=new ArrayList<>();
        while(cursor.moveToNext())
        {
            Map<String,String> map=new HashMap<>();
            map.put("word",cursor.getString(cursor.getColumnIndex("word")));
            map.put("detail",cursor.getString(cursor.getColumnIndex("detail")));
            result.add(map);
        }
        return result;
    }

    @Override
    protected void onDestroy() {
        //程序退出时对资源进行销毁
        super.onDestroy();
        if (mDatabase!=null) {
            mDatabase.close();
        }
        if (myDataBaseHelper!=null) {
            myDataBaseHelper.close();
        }
    }
}

跳转到了显示界面即ResurtActivity,写一个listview布局展示数据:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
    android:background="@mipmap/wordbak"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent">
    <ListView
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

listView的子项布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical">
 <LinearLayout android:layout_height="wrap_content"
     android:layout_marginTop="10dp"
     android:orientation="horizontal"
     android:layout_width="match_parent">
     <TextView
         android:text="单词:"
         android:textSize="20dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
     <TextView
         android:id="@+id/word"
         android:textSize="25dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 </LinearLayout>
    <LinearLayout android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal"
        android:layout_width="match_parent">
        <TextView
            android:text="解释:"
            android:textSize="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/detail"
            android:textSize="25dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

下面在ResurtActivity中获取搜索到的List集合数据,并用SimpleApapter实现listView的适配器:

package com.example.studyapp.word;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.example.studyapp.R;

import java.util.List;
import java.util.Map;

public class ResultActivity extends AppCompatActivity {
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        listView=findViewById(R.id.list_item);
        Intent intent = getIntent();
        Bundle bundle=intent.getExtras();
        List<Map<String,String>> listData= (List<Map<String, String>>) bundle.getSerializable("data");
        for (Map<String, String> listDatum : listData) {
            Log.w("数据",listDatum.get("word")+listDatum.get("detail"));
        }
        SimpleAdapter adapter=new SimpleAdapter(ResultActivity.this,
                listData,
                R.layout.resultlaout,
                new String[]{"word","detail"},new int[]{R.id.word,R.id.detail});
        listView.setAdapter(adapter);
    }
}

到此生词本的大致功能已经实现。

后续继续更新一些简单的小项目。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值