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);");
}
答案 0 :(得分:0)
如果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;
答案 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
];
。
答案 2 :(得分:0)
我相信您有几个问题。
第一个问题是您使用对象 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中的值。
您可能会遇到以下崩溃:-
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中的值。
第二个问题(潜在问题)是,如果用户输入非数字值,则该应用将由于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
因此,将要搜索的参数用单引号引起来会更安全。
最后一个问题是您正在搜索不存在的列。也就是说,当列名定义为 sid 时,您将拥有WHERE ID = ....
。
String query="SELECT * FROM " + Tablestud + " WHERE "
+ "sid" + " = '" + studid.getText().toString() + "'" ;