После сравнения и получения значения мое приложение принудительно закрывается - PullRequest
0 голосов
/ 28 октября 2018
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 голосов
/ 28 октября 2018

Проблема в том, что вы выполняете запрос БД в потоке пользовательского интерфейса.Поток пользовательского интерфейса блокируется из-за этого, и, следовательно, ваше приложение не отвечает (ошибка ANR)

Вам необходимо запустить его в фоновом потоке.Для начала используйте AsyncTask.

См. this и this

0 голосов
/ 28 октября 2018

Я считаю, что у вас есть несколько проблем.

Проблема 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)

  • what_the_user_has_entered представляет значение, которое вводит пользовательв текстовый редактор 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 в строку с помощью метода CharSequence toString .

Таким образом, исправление для этой проблемы состоит в том, чтобы не использовать.... + 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.

Последняя проблема заключается в том, что вы ищете столбец, который не существует,То есть у вас есть WHERE ID = ...., когда имя столбца было определено как sid .


Таким образом, можно использовать полное исправление: -

String query="SELECT  * FROM " + Tablestud + " WHERE "
        + "sid" + " = '" + studid.getText().toString() + "'" ;
  • ID был изменен на sid .
  • studid был изменен на studid.getText ().ToString () .

    - Результат из studid.getText.toString () был заключен в одинарные кавычки .

0 голосов
/ 28 октября 2018

Оператор SELECT выглядит нормально, если Tablestud - это имя таблицы, ID - это имя столбца, а studid - допустимое целочисленное значение.Проблема может быть здесь:

cursor.moveToNext();

moveToNext() возвращает true или false, если есть или нет следующий ряд, но вы не выполните эту проверку:

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

Конечно, если естьесли строки не возвращаются, studn.setText(name); не будет выполнено.Вам не нужно cursor.moveToLast(); РЕДАКТИРОВАТЬ В опубликованном вами коде я вижу, что имя столбца sid, а не ID, поэтому внесите следующие изменения:

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