做内网网站,网站界面设计如何实现功能美与形式美的统一,扬州哪里做网站,六安网站怎么做seo一般使用到数据库存储#xff0c;涉及到的数据量都较大#xff0c;采用文件存储也能完成#xff0c;但是文件操作复杂#xff0c;效率低#xff0c;大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite#xff0c;直接按照数… 一般使用到数据库存储涉及到的数据量都较大采用文件存储也能完成但是文件操作复杂效率低大量结构化数据通常采用关系型数据库存储较为合适。Android中已经嵌入了轻量级的关系型数据库SQLite直接按照数据库操作实现增删改查即可。如果你想要完成一个简单增删改查作品可以使用UI设计页面跳转对话框数据库技术架构。 数据库操作一般分为两个步骤创建数据库接下来写SQL语句执行并查看结果常见操作为增删改查。
第1步配置权限主要是因为API版本可能不同配置一下权限较好高版本都无需配置我测试使用的是API34所以我没有配置
uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE/
第2步设计布局
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticaltools:context.MainActivityLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationhorizontalTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text用户名 /EditTextandroid:idid/usernameandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:hint请输入用户名 //LinearLayoutLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationhorizontalTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text密 码 /EditTextandroid:idid/pwdandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:hint请输入密码 //LinearLayoutButtonandroid:idid/addandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text增加 /Buttonandroid:idid/deleteandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text删除 /Buttonandroid:idid/updateandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text修改 /Buttonandroid:idid/queryandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text查询 //LinearLayout
设计图效果 增加操作输入用户名和密码点击增加往数据库中添加一条数据。
删除操作根据用户输入的用户名删除一条数据。注当然如果不存在删除肯定会失败这些处理我就没有关注了案例主要想表达的是能删除如果需要做的精致或者实际开发中用到请务必考虑周全
修改操作根据用户输入的用户名来更新密码所以此时输入的密码相当于是覆盖旧值。
查询操作将表中的数据全部查出并显示即可实际开发中结合ListViewArrayAdapter效果更佳
第3步请求权限并获得授权后创建数据库。如果你没有配置权限则这一步都可以跳过了
具体操作在onCreate回调方法中动态请求权限授权成功后创建数据库 if (Build.VERSION.SDK_INT Build.VERSION_CODES.M) {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);File file new File(data/data/com.yibinu.sqlitedemo/testdb.db3);Log.i(目录, onCreate: file);if (file.exists() !file.isDirectory()) {sqLiteDatabase SQLiteDatabase.openOrCreateDatabase(file, null);String sql create table testdb(username varchar(10),pwd varchar(6));sqLiteDatabase.execSQL(sql);} else {Log.i(, onCreate: 文件不存在);}}
如果你在测试时创建失败还可以去指定目录位置手动创建文件testdb.db3
由于我的测试版本较高就没有去写授权直接使用
第4步逻辑文件
package com.yibinu.sqlitedemo;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.File;public class MainActivity extends AppCompatActivity implements View.OnClickListener {Button add;Button delete;Button update;Button query;EditText username;EditText pwd;SQLiteDatabase sqLiteDatabase null;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);add findViewById(R.id.add);delete findViewById(R.id.delete);update findViewById(R.id.update);query findViewById(R.id.query);username findViewById(R.id.username);pwd findViewById(R.id.pwd);delete.setOnClickListener(this);add.setOnClickListener(this);update.setOnClickListener(this);query.setOnClickListener(this);File file new File(data/data/com.yibinu.sqlitedemo/testdb.db3);Log.i(目录, onCreate: file);if (file.exists() !file.isDirectory()) {sqLiteDatabase SQLiteDatabase.openOrCreateDatabase(file, null);String sql create table testdb(username varchar(10),pwd varchar(6));sqLiteDatabase.execSQL(sql);} else {Log.i(, onCreate: 文件不存在);}}Overridepublic void onClick(View v) {int id v.getId();if (id R.id.add) {String userName username.getText().toString().trim();String pWD pwd.getText().toString().trim();String addSql insert into testdb(username,pwd) values(?,?);;sqLiteDatabase.execSQL(addSql, new String[]{userName, pWD});Toast.makeText(this, 插入数据成功, Toast.LENGTH_SHORT).show();} else if (id R.id.delete) {String delUserName username.getText().toString().trim();String deleteSql delete from testdb where username?;sqLiteDatabase.execSQL(deleteSql, new String[]{delUserName});Toast.makeText(this, 删除数据成功, Toast.LENGTH_SHORT).show();} else if (id R.id.update) {String newUserName username.getText().toString().trim();String pWDD pwd.getText().toString().trim();String updateSql update testdb set pwd? where username ?;sqLiteDatabase.execSQL(updateSql, new String[]{pWDD, newUserName});Toast.makeText(this, 更新数据成功, Toast.LENGTH_SHORT).show();} else if (id R.id.query) {String queryDateSql select * from testdb;Cursor cursor sqLiteDatabase.rawQuery(queryDateSql, null);while (cursor.moveToNext()) {String myname cursor.getString(0);String mypwd cursor.getString(1);Log.i(【查询结果】, 姓名: myname 密码 mypwd);}Toast.makeText(this, 查询成功请查看日志, Toast.LENGTH_SHORT).show();}}
}效果
运行成功后出现主界面 接下来看动态演示 SQLite效果 核心技术
SQLiteDatabase类通过该类对象可以执行SQL语句具体操作通过openOrCreateDatabase方法创建一个数据库对象需要两个参数
public static SQLiteDatabase openOrCreateDatabase(NonNull File file,Nullable CursorFactory factory)
数据库名游标工厂
当然一般方法和构造方法都可以重载所以如果你看到有多个参数也可以查看一下原型就可以直接使用了。
接下来就通过数据库对象执行SQL语句核心方法是
public void execSQL(String sql, Object[] bindArgs)
SQL语句参数
看个添加一行数据的案例
String userName username.getText().toString().trim();
String pWD pwd.getText().toString().trim();
String addSql insert into testdb(username,pwd) values(?,?);;
sqLiteDatabase.execSQL(addSql, new String[]{userName, pWD});
前两行获取用户输入的用户名和密码第3行构造一个SQL语句如果有参数就使用占位置第4行执行SQL语句由于有参数所以要把真实的数据去替换所占据的位置。如果没有参数就写为null执行结束后数据库中就已经添加上该条数据了。
修改和删除是一样的道理查询要复杂一点它的复杂在于数据库的主要功能就是查询查询结果通常是多行数据就需要使用到游标如果你会Oracle数据库操作游标就非常简单了
查询可以是带参的也可以是不带参数的
String queryDateSql select * from testdb;Cursor cursor sqLiteDatabase.rawQuery(queryDateSql, null);while (cursor.moveToNext()) {String myname cursor.getString(0);String mypwd cursor.getString(1);Log.i(【查询结果】, 姓名: myname 密码 mypwd);}
游标可以简单理解为指向这个结果集第一次移动则来到第一行再移动一次就来到第二行
所以只要移动后数据不为空则表示移动后的位置是有一条数据的就可以获取到对应的值
移动主要依靠moveToNext方法读取对应的值则使用getXXX方法