SQLite查询问题

sqlite> select * from Book;
没有反应
Book表中已添加两条数据
如图
2018-08-13 11:16 添加评论 分享
已邀请:
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 );

    }*/

}
}

要回复问题请先登录注册

退出全屏模式 全屏模式 回复