比较并获得价值后,我的应用被强制关闭

时间:2018-10-28 06:45:53

标签: java android android-sqlite

public void onClick(View v) {
     if (v==showids){
    String query="SELECT  * FROM " + Tablestud + " WHERE "
                        + "ID" + " = " + studid;
                String name;
                SQLiteDatabase db= controller4.getReadableDatabase();
                Cursor cursor=db.rawQuery(query,null);
                cursor.moveToNext();
                name=cursor.getString(1);
                studn.setText(name);
                cursor.moveToLast();
                db.close();
                Toast.makeText(getApplicationContext(), "Succesfully Name Display", Toast.LENGTH_SHORT).show();
            }
        }

我的Where子句或游标有问题吗?

studn(TEXTVIEW)没有响应,没有显示。

package afinal.androidsql.com.afinal;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class borrow extends AppCompatActivity implements View.OnClickListener{
    DB_controller controller4;
    EditText studid;
    Button showids;
    TextView studn;
    private static final String Tablestud="stud";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_borrow);
        controller4 =new DB_controller(getApplicationContext());
        studid = findViewById(R.id.studid);
        showids =findViewById(R.id.showids);
        showids.setOnClickListener(this);
        studn = findViewById(R.id.studn);
    }


    @Override
    public void onClick(View v) {
        if (v==showids){
            String query="SELECT  * FROM " + Tablestud + " WHERE "
                    + "ID" + " = " + studid ;
            String name;
            SQLiteDatabase db= controller4.getReadableDatabase();
            Cursor cursor=db.rawQuery(query,null);
            if (cursor.moveToNext()) {
                name=cursor.getString(1);
                studn.setText(name);
            }
            db.close();
            Toast.makeText(getApplicationContext(), "Succesfully Data Recorded!", Toast.LENGTH_SHORT).show();
        }
    }
}

DB_controller.java

package afinal.androidsql.com.afinal;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.Editable;
import android.widget.TableLayout;
import android.widget.TableRow;

public class DB_controller extends SQLiteOpenHelper {

    private static final String Tablebook="book";
    private static final String Tablestud="stud";
    public DB_controller(Context context) {
        super(context,"lib.db", null, 1);


    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE stud( sid INTEGER PRIMARY KEY ,sname TEXT UNIQUE,sgender TEXT, scay TEXT);");
    }

3 个答案:

答案 0 :(得分:0)

如果SELECT是表的名称,Tablestud是列的名称,而ID是有效的整数值,则studid语句似乎没问题。 问题可能在这里:

cursor.moveToNext();

moveToNext()返回truefalse,如果没有下一行,但您没有进行此检查:

if (moveToNext()) {
    name=cursor.getString(1);
    studn.setText(name);
}

当然,如果没有返回行,则将不执行studn.setText(name);
您不需要cursor.moveToLast();
编辑,我在您发布的代码中看到该列的名称为sid而不是ID,因此请进行以下更改:

String query="SELECT  * FROM " + Tablestud + " WHERE sid = " + studid;

答案 1 :(得分:0)

问题是您正在UI线程中运行数据库查询。 UI线程因此而被阻塞,因此您的应用程序没有响应(ANR错误)

您需要在后台线程中运行它。首先,请使用import { LocationStrategy, PathLocationStrategy } from '@angular/common'; const appRoutes: Routes = [{ path: '', redirectTo:'contents', pathMatch:'full' }, { path: 'contents', component: ContentsComponent }, { path: 'sidebar', component: SidebarComponent }, { path:'**', component:PageNotFoundComponent ];

引用thisthis

答案 2 :(得分:0)

我相信您有几个问题。

问题1。

第一个问题是您使用对象 studid (一个EditText对象)作为搜索参数,而不是使用已输入到EditText中的数据。

  • 您实际上是在说SELECT * FROM stud WHERE ID = android.support.v7.widget.AppCompatEditText@53465a40 )而不是SELECT * FROM stud WHERE ID = whatever_the_user_has_entered)

  • whatever_the_user_has_entered 重新设置用户输入studin editText中的值。

  • 语法错误是由于句号/句号停止,因为SQlite作为未填充的句点/填充句号表示前缀,并且您最多可以有2个(schema.table.column)和有4。

您可能会遇到以下崩溃:-

10-28 19:58:41.795 1681-1681/so53029037.so53029037 E/AndroidRuntime: FATAL EXCEPTION: main
    android.database.sqlite.SQLiteException: near ".": syntax error (code 1): , while compiling: SELECT  * FROM stud WHERE sid = android.support.v7.widget.AppCompatEditText@53465a40
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
        at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
        at so53029037.so53029037.borrow.onClick(borrow.java:39)
        at android.view.View.performClick(View.java:4084)
        at android.view.View$PerformClick.run(View.java:16966)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

您需要获取通过对象的 getText 方法输入的数据,然后通过CharSequence toString 方法将返回的CharSequence转换为String。

这样,解决此问题的方法是不使用.... + studid,而是使用.... + studid.getText().toString()来获取已输入到ExitText中的值。

  • (..表示其他未简要显示的代码)

问题2(也许)。

第二个问题(潜在问题)是,如果用户输入非数字值,则该应用将由于SQLite语法错误(例如,如果用户输入A,则:-

10-28 19:52:10.031 1604-1604/so53029037.so53029037 E/AndroidRuntime: FATAL EXCEPTION: main
    android.database.sqlite.SQLiteException: no such column: A (code 1): , while compiling: SELECT  * FROM stud WHERE sid = A

因此,将要搜索的参数用单引号引起来会更安全。

问题3。

最后一个问题是您正在搜索不存在的列。也就是说,当列名定义为 sid 时,您将拥有WHERE ID = ....


因此,完整的解决方法是使用:-

String query="SELECT  * FROM " + Tablestud + " WHERE "
        + "sid" + " = '" + studid.getText().toString() + "'" ;
  • ID 已更改为 sid
  • 研究已更改为 studid.getText()。ToString()

    -来自studid.getText.toString()的结果已包装/括在单引号中。