【问题标题】:unable to search database from button.setOnClick .getText as String becomes null无法从 button.setOnClick .getText 搜索数据库,因为 String 变为 null
【发布时间】:2017-05-24 16:50:56
【问题描述】:

我正在制作 android 应用程序,该应用程序在按下 button.setOnClick() 的按钮时从 EditText 获取用户输入,并使用 string.getText() 搜索数据库。但是字符串变为空,我无法发送它

搜索功能所在的DbBackend.class。 我检查了数据库在静态查询上工作正常,您可以将其设置为 = "xyz" 但我无法使用用户输入来查询数据库。

这是我的代码:MainActivity.java

package com.vadhod.dictcopy;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import java.sql.Array;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    EditText searchBar;
    Button searchButton;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final DbBackend dbBackend = new DbBackend(MainActivity.this);

        searchBar = (EditText) findViewById(R.id.searchBar);
        searchButton = (Button) findViewById(R.id.searchButton);
        textView = (TextView)findViewById(R.id.textView);




        searchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                try {

                    String input = searchBar.getText().toString();

                    ArrayList<String> terms = dbBackend.getList(input);

                    StringBuilder builder = new StringBuilder();
                    for (String details : terms) {
                        builder.append(details + "\n");
                    }

                    textView.setText(builder.toString());


                }catch (Exception e){
                    e.printStackTrace();
                }


            }
        });

    }

}

DbBackend.java

package com.vadhod.dictcopy;

import ...

public class DbBackend extends DatabaseObject {

    public DbBackend(Context context){
        super(context);
    }

        public ArrayList<String> getList(String search){
        ArrayList<String> kWords = new ArrayList<String>();
        String searchQuery = "SELECT kName FROM dictionary WHERE eName LIKE '%" + search + "%'";

        try {
            Cursor kCursor = this.getDbConnection().rawQuery(searchQuery, null);
            if (kCursor != null){
                kCursor.moveToFirst();
                for (int i = 0; i < kCursor.getCount(); i++ ){
                    String sword = kCursor.getString(kCursor.getColumnIndexOrThrow("kName"));
                    kWords.add(sword);
                    kCursor.moveToNext();
                }
                kCursor.close();
                return kWords;
            }
            return kWords;
        }catch (Exception e){
            e.printStackTrace();
        }
        return kWords;
    }
}

关于当用户按下搜索按钮并通过数据库搜索并返回查询时如何使用字符串的任何帮助?

更新了移动的代码

【问题讨论】:

  • 什么是DatabaseObject?
  • 这是两个支持的 java 类 DatabaseObject.java 和 DictionaryDatabase.java。我正在使用来自 github 的 com.readystatesoftware.sqliteasset:sqliteassethelper:+
  • 其他一切都运行良好。如果我愿意,可以检索所有对象并将其显示在列表视图中。但我不需要,所以删除了该代码
  • 写了答案,不确定是否足够清楚。如果没有,可以尝试详细说明。
  • @khusrav 照你说的做了。在 onClick 中移动了 stringbuilder 代码,但出现了 null 错误。有没有其他方法可以在按钮单击时从 editText 中提取数据

标签: java android android-sqlite android-database


【解决方案1】:

假设在searchButton.setOnClickListener(new View.OnClickListener() {...}); 内部搜索正在工作,而在外部 - 没有。问题是你的

//Option 1 not working
ArrayList<String> terms2 = dbBackend2.getList(input);

在向用户显示任何视图之前在 Activity 设置期间调用。所以,input 当时没有填写。您必须将此代码移动到 onclick 侦听器中,就像您在上面这些行的代码中所做的那样。

或者为input提供一些其他来源。

更新: 对于 NullPointer:在您的布局文件 activity_main 中,您需要有一个 ID 为 textView 的 TextView。因为你做了以下事情:

    // find the textview in the layout
            textView = (TextView)findViewById(R.id.textView);

    // do the search, get results
...
    // set textview's text, at this moment textView must not be null
            textView.setText(kbuilder.toString());

【讨论】:

  • W/System.err: java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”
  • @Sykox 您在那里使用哪个 TextView?你用findViewById找到了吗?
  • 是的 textView 是全局贴花的,并且使用 findviewbyid 找到了它
  • 你能用移动的部分更新代码吗?很明显,在设置文本的那一刻,某些 textview 为 null,我们只需要找出是哪一个以及何时。
  • 成功了...感谢百万好友!现在我只想创建一个意图并将 textView 移动到新活动。
猜你喜欢
  • 2022-10-13
  • 2022-06-10
  • 2022-11-12
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2021-04-29
相关资源
最近更新 更多