SQLite查询问题
sqlite> select * from Book;
没有反应
Book表中已添加两条数据
如图
没有反应
Book表中已添加两条数据
如图


0
WangYoyHu - Android开发攻城狮
查不到就是没创建成功白
下面是本人写的代码 以及注释 你可以借鉴一下
package com.liziyang.dall;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.RippleDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
//初始化控件
private Button button,button2,button3,button4,button5,button6,button7,button8,button9;
private EditText editText,editText2,editText3;
private ListView listView;
//如果要使用有功能的java来辅助主界面 需要指明
private MyOpenHelper myOpenHelper;
//Cursor光标
private Cursor cursor;
//dialog对话 指明对话框
private Dialog dialog;
//设定初始id=-1 id不可能为-1
private String id="-1";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
button=findViewById( R.id.button );
button2=findViewById( R.id.button2 );
button3=findViewById( R.id.button3 );
button4=findViewById( R.id.button4 );
button5=findViewById( R.id.button5 );
button6=findViewById( R.id.button6 );
button7=findViewById( R.id.button7 );
button8=findViewById( R.id.button8);
button9=findViewById( R.id.button9 );
editText=findViewById( R.id.editText );
editText2=findViewById( R.id.editText2 );
editText3=findViewById( R.id.editText3 );
listView=findViewById( R.id.listView );
//写一个方法用来创建对话框 然后在这里指明 名字可以自定义
createDialog();
//使用另外一个服务为主界面 就要初始化 格式为My my=new My(this); 括号里为上下文
myOpenHelper=new MyOpenHelper( this );
//创建对话框
button7.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
//这里使用一个查询的对话框
//这里使用点击按钮显示对话框 在下面创建好 指明名字 然后调用 格式为name.show(0;
dialog.show();
//查找
//显示在editText上
}
} );
button8.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
delete();
}
private void delete() {
//这里删除浏览到的数据 如果想改变思路就可以借鉴这个方法
String id=cursor.getString( cursor.getColumnIndex( "_id" ) );
SQLiteDatabase sqLiteDatabase=myOpenHelper.getReadableDatabase();
//sqLiteDatabase.delete( "User","_id=?",new String[]{id} );这里是为了提示用户删除成功 也可以不用
int line=sqLiteDatabase.delete( "User","_id=?",new String[]{id} );
if (line>0){
Toast.makeText( MainActivity.this,"数据删除成功",Toast.LENGTH_SHORT ).show();
}
//每次使用完成后关闭他
sqLiteDatabase.close();
displayAllUser();
}
} );
button9.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
change();
}
private void change() {
//得到游标指向的数据
String id=cursor.getString( cursor.getColumnIndex( "_id" ) );
SQLiteDatabase sqLiteDatabase=myOpenHelper.getWritableDatabase();
//初始化 得到输入的数据 指明trim修改
ContentValues contentValues=new ContentValues( );
contentValues.put( "name",editText.getText().toString().trim() );
contentValues.put( "age",editText2.getText().toString().trim() );
contentValues.put( "score",editText3.getText().toString().trim() );
int line=sqLiteDatabase.update( "User",contentValues,"_id=?",new String[]{id} );
//当数据修改后 最少改变一条数据 即大于0
if (line>0){
Toast.makeText( MainActivity.this,"数据修改成功",Toast.LENGTH_SHORT).show();
}
sqLiteDatabase.close();
displayAllUser();
}
} );
//设置光标的查找位置 这里使用读的方式 只有往里面写的情况下才会调用写 query询问
cursor=myOpenHelper.getReadableDatabase().query( "User",null,null,null,null,null,null);
button6.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
//可以使用一个方法 命名 然后点击调用 可以使代码容易看懂 也可以直接将方法写在这里
lastest();
}
private void lastest() {
//光标移动 这里加了if 当光标移动到最后的位置 然后调用下面的方法
if (cursor.moveToLast()){
display();
}
}
private void display() {
//设置得到的输入内容为string类型 column柱 index指数
String name=cursor.getString( cursor.getColumnIndex( "name" ) );
String age=cursor.getString( cursor.getColumnIndex( "age" ) );
String number=cursor.getString( cursor.getColumnIndex( "score" ) );
//将得到的数据添加到输入框里 也可以直接使用下面的方法直接调用 只不过上面繁琐一点 是为了更好理解得到的数据的类型
//editText.setText( cursor.getString( cursor.getColumnIndex( "name" ) ) );
editText.setText( name );
editText2.setText( age );
editText3.setText( number );
}
} );
button5.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
next();
}
private void next() {
if (cursor.moveToNext()){
display();
}
}
private void display() {
String name=cursor.getString( cursor.getColumnIndex( "name" ) );
String age=cursor.getString( cursor.getColumnIndex( "age" ) );
String number=cursor.getString( cursor.getColumnIndex( "score" ) );
editText.setText( name );
editText2.setText( age );
editText3.setText( number );
}
} );
button4.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
last();
}
private void last() {//上一个
if (cursor.moveToPrevious() ){
display();
}
}
private void display() {
String name=cursor.getString( cursor.getColumnIndex( "name" ) );
String age=cursor.getString( cursor.getColumnIndex( "age" ) );
String number=cursor.getString( cursor.getColumnIndex( "score" ) );
editText.setText( name );
editText2.setText( age );
editText3.setText( number );
}
} );
button3.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
first();
}
private void first() {
if (cursor.moveToFirst()){//游标移动到第一条 是否存在
display();//创建一个新的方法
}
}
private void display() {
String name=cursor.getString( cursor.getColumnIndex( "name" ) );
String age=cursor.getString( cursor.getColumnIndex( "age" ) );
String number=cursor.getString( cursor.getColumnIndex( "score" ) );
editText.setText( name );
editText2.setText( age );
editText3.setText( number );
}
} );
myOpenHelper=new MyOpenHelper( this );
button2.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
//查询表格内容
//可以自定义一个方法的名字 然后下面创建调用
queryStudent();
//query询问
}
private void queryStudent() {
//当使用数据库 都要调用SQLiteDatabase 注意这里是读取数据
SQLiteDatabase sqLiteDatabase=myOpenHelper.getReadableDatabase();
//Cursor光标 导航 query询问
//在上面已经指明了光标的搜索位置
//query询问
/**@SuppressLint("Recycle") Cursor cursor=sqLiteDatabase.query(
"User",//表名
null,//列名String数组所有列就写空"age"
"_id=?",//地址
new String[] {"1"},// 行参数
null,// group来源于
null,// 条件
null);// 排序*/
//CursorAdapter光标导航适配器 上下文 输入上面写的光标cursor的名字
//这里设置了光标适配器 而且也用了new的方法 新建和初始化都要用到new方法 括号里为上下文 和光标的名字
CursorAdapter adapter=new CursorAdapter(MainActivity.this,cursor) {
//这里启用两个方法 当创建光标适配器
@Override
public View newView(Context context,Cursor cursor,ViewGroup viewGroup) {
//将数据导入布局 使用布局管理器 LayoutInflater布局扩展器 inflate膨胀
//这里设置一个数据显示布局 视图 视图名= 等于 布局扩展 来自 主界面上下文 扩展 布局位置 权限无
@SuppressLint("InflateParams") View view= LayoutInflater.from( MainActivity.this ).inflate( R.layout.sql_layout ,null);
//返回数据视图表
return view;
}
@Override
public void bindView(View view,Context context,Cursor cursor) {
//绑定视图 这里写视图里的内容
//bind绑定 bindView绑定视图
TextView textName=view.findViewById( R.id.textView5 );
TextView textAge=view.findViewById( R.id.textView7 );
TextView textNumber=view.findViewById( R.id.textView9 );
//数据库 column柱 index指数
//int类型数据 游标得到柱指数 列名
int columnIndex=cursor.getColumnIndex( "name" );
//定义string类型数据 等于游标得到string类型里的int类型
String name=cursor.getString( columnIndex );
int columnIndex2=cursor.getColumnIndex( "age" );
String age=cursor.getString( columnIndex2 );
int columnIndex3=cursor.getColumnIndex( "score" );
String number=cursor.getString( columnIndex3 );
//设置显示
//将得到的数据填充至输入框 这里将数据显示在输入框里
textName.setText( name );
textAge.setText( age );
textNumber.setText(number );
}
};
//listView都要设置一个适配器 用来显示数据
listView.setAdapter( adapter );
//listView设置适配器 括号里是一个方法
}
} );
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
//当点击的时候调用方法
insertUser();
//输入过将输入框内容清空
editText.setText( "" );
editText2.setText( "" );
editText3.setText( "" );
//写入方法适配器 这里将键盘输入完成隐藏
InputMethodManager imm= (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE );
imm.toggleSoftInput( 0,InputMethodManager.HIDE_NOT_ALWAYS );
}
private void insertUser() {
//trim修剪
String stuName=editText.getText().toString().trim();
String stuAge=editText2.getText().toString().trim();
String stuNumber=editText3.getText().toString().trim();
//这里是写入数据getWritableDatabase data数据base基础 able能够
//数据库等于另外一个界面得到写的适配器
SQLiteDatabase sqLiteDatabase=myOpenHelper.getWritableDatabase();
//values值 参数 ContentValues 上下文参数值 这里初始化
//上下文参数 初始化
ContentValues contentValues=new ContentValues( );
//列名 添加的数据
contentValues.put( "name",stuName );
contentValues.put( "age",stuAge );
contentValues.put( "score",stuNumber );
//插入数据 第一个表名 第二个列名 第三个ConTentValues对象 相当于map 写null就是全部默认值
//将long数据命名为rowed等于 sql数据添加到表格名 空值 数据名 这里数据名包括多个数据
long rowId=sqLiteDatabase.insert( "User",null,contentValues );//insert插入
Log.i( "TEST","rowId"+rowId );//使用显示插入成功的logcat显示
//使用-1 不用0 才能检测出来
if (rowId!=-1){
Toast.makeText( MainActivity.this,"数据插入成功",Toast.LENGTH_SHORT ).show();
}
//别忘了使用完成 将sql管理器关闭
sqLiteDatabase.close();
}
} );
}
private void displayAllUser(){
cursor=myOpenHelper.getReadableDatabase().query( "User",null,null ,null,null,null,null);
//简单游标适配器初始化 并绑定数据库列的名字 和数据得到的控件位置
SimpleCursorAdapter simpleCursorAdapter=new SimpleCursorAdapter( this,R.layout.sql_layout,cursor,new String[]{"name","age","score"},
new int[]{R.id.editText,R.id.editText2,R.id.editText3
} );
listView.setAdapter( simpleCursorAdapter );
}
private void createDialog(){
//解析
//设置对话框的数据
View view=LayoutInflater.from( this ).inflate( R.layout.chat,null);
//final最终
final EditText editText_find=view.findViewById( R.id.editText4 );
dialog=new AlertDialog.Builder( this )
.setView( view )//设置视图名字 这里是自定义的布局
.setTitle( "搜索" )//设置标题
.setPositiveButton( "取消",new DialogInterface.OnClickListener() {//设置按钮监听以及功能的实现
@Override
public void onClick(DialogInterface dialogInterface,int i) {
//这里点击后id等于-1 自动关闭 因为id不可能为-1
id="-1";
}
} )
.setNegativeButton( "点击搜索",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface,int i) {
//得到输入的id id为输入框输入的内容
id=editText_find.getText().toString().trim();
//查找 得到数据后开始寻找
finduserId(id);
}
} )
.create();//创建
}
private void finduserId(String id2){
//得到读的数据基础 _id可以自增加
Cursor cursor=myOpenHelper.getReadableDatabase().query( "User",null,"_id=?",new String[]{id2},null,null,null );
if (cursor.moveToFirst()){
String name=cursor.getString( cursor.getColumnIndex( "name" ) );
String age=cursor.getString( cursor.getColumnIndex( "age" ) );
String score=cursor.getString( cursor.getColumnIndex( "score" ) );
editText.setText( name );
editText2.setText( age );
editText3.setText( score );
}else {
Toast.makeText( this,"该数据没有找到 请重试",Toast.LENGTH_SHORT ).show();
}
}
}
下面是辅助类代码
package com.liziyang.dall;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
public class MyOpenHelper extends SQLiteOpenHelper {
//public static final int VERSION=1;
public static final int VERSION=2;
public MyOpenHelper(Context context) {
super( context,"User.a",null,VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//创建一张表 _id是自动编号的User 表名
String sql="create table User(_id integer primary key autoincrement,"+"name,"+"age,"+"score)";
//execSQL提交数据库 当增 删 改时调用这个提交
sqLiteDatabase.execSQL( sql );
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion,int newVersion) {
//在版本号更新时改变表的结构 i新版本 i1旧版
/** if (oldVersion==1&&newVersion==2){
//更改表结构
//1删除表
String sql="drop table if exists User";
sqLiteDatabase.execSQL( sql );
//2新建表
String sql2="create table User(_id integer primary key autoincrement,"+"name,"+"age,"+"message,"+"score)";
sqLiteDatabase.execSQL( sql2 );
}*/
}
}