Android Studio - 从 SQLite 数据库加载 RecyclerView 在 Edittext 中输入一个单词

Posted

技术标签:

【中文标题】Android Studio - 从 SQLite 数据库加载 RecyclerView 在 Edittext 中输入一个单词【英文标题】:Android Studio - Loading RecyclerView from SQLite Database entering a word in Edittext 【发布时间】:2020-05-09 08:55:10 【问题描述】:

我正在使用 android Studio,我的项目中的数据库 SQLite 上上传了一个包含 3 条记录的表。

public class BaseDeDatos extends SQLiteOpenHelper 

public BaseDeDatos(Context context, String s, Context applicationContext, int i) 
    super(context, "verbos.db", null, 10);


@Override
    public void onCreate(SQLiteDatabase db) 
        db.execSQL("create table verbos(id integer, verbos text, referencia text, eu text, voce text, nos text)");
        db.execSQL("insert into verbos values(1, 'agito', 'abalo', 'abala', 'abalamos', 'abalam')," +
                "(1, 'agito', 'abalava', 'abalava', 'abalávamos', 'abalavam')," +
                "(1, 'agito', 'abalei', 'abalou', 'abalamos', 'abalaram')");
    

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) 
        db.execSQL("DROP TABLE IF EXISTS verbos");
        db.execSQL("create table verbos(id integer, verbos text, referencia text, eu text, voce text, nos text)");
        db.execSQL("insert into verbos values(1, 'agito', 'abalo', 'abala', 'abalamos', 'abalam')," +
                "(1, 'agito', 'abalava', 'abalava', 'abalávamos', 'abalavam')," +
                "(1, 'agito', 'abalei', 'abalou', 'abalamos', 'abalaram')");
    

这是我正在工作的“Verbos2”活动:

public class Verbos2 extends AppCompatActivity 

ArrayList<Item> listaItem;
RecyclerView recyclerViewItem;
EditText etVerbos;
Button mostrar;

BaseDeDatos conn;

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

    etVerbos = findViewById(R.id.etIngresar);
    mostrar = findViewById(R.id.bnMostrar);

    listaItem = new ArrayList<>();
    recyclerViewItem=findViewById(R.id.rvListItems);
    LinearLayoutManager manager = new LinearLayoutManager(this);
    recyclerViewItem.setLayoutManager(manager);
    recyclerViewItem.setHasFixedSize(true);

    RecyclerViewAdapter adapter = new RecyclerViewAdapter(listaItem);
    recyclerViewItem.setAdapter(adapter);

 //   recyclerViewItem.setLayoutManager(new LinearLayoutManager(this));


    mostrar.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            BaseDeDatos admin = new BaseDeDatos(getApplicationContext(), "verbos.db", getApplicationContext(), 10);
            SQLiteDatabase db = admin.getReadableDatabase();
            Item item = null;
            String[] parametros = etVerbos.getText().toString();
            Cursor cursor=db.rawQuery("select * from verbos WHERE verbos =?", parametros);

            while (cursor.moveToNext())
                item = new Item();
                item.setVerbo(cursor.getString(0));
                item.setReferencia(cursor.getString(1));
                item.setEu(cursor.getString(2));

                listaItem.add(item);
            
        
    );



当我在 EditText 中设置单词“agito”时,我试图用我的 SQLite 数据库中的数据加载我的 Recycler View,(它应该给我带来我数据库中 3 条记录的信息,因为“agito”在“verbo”字段中的所有记录中),但是当我编写并单击按钮时,什么也没有发生。没有错误,只是RecyclerView中什么都没有出现:

这是recyclerview布局的图片,以便更好地理解:

这是我的 Recycler View 活动:

public class RecyclerViewAdapter extends RecyclerView.Adapter 
private ArrayList<Item> listItem ;

public RecyclerViewAdapter(ArrayList<Item> listItem) 
    this.listItem = listItem;


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    View contentView = LayoutInflater.from(parent.getContext()).inflate(R.layout.lista, parent, false);
    System.out.println("CREATE VIEW HOLDER: " + viewType);
    return new Holder(contentView);



@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    Item item = listItem.get(position);
    Holder Holder = (Holder) holder;
    Holder.tvVerbo.setText(item.getVerbo());
    Holder.tvReferencia.setText(item.getReferencia());
    Holder.tvEu.setText(item.getEu());

    System.out.println("BIND VIEW HOLDER: " + position);


@Override
public int getItemCount() 
    return listItem.size();


public class Holder extends RecyclerView.ViewHolder
    TextView tvVerbo;
    TextView tvReferencia;
    TextView tvEu;


    public Holder(View itemView) 
        super(itemView);
        tvVerbo = itemView.findViewById(R.id.tvLista1);
        tvReferencia = itemView.findViewById(R.id.tvLista2);
        tvEu = itemView.findViewById(R.id.tvLista3);
    

我认为我在“Verbos2”中遗漏了一些东西,无法从我的 SQLite 数据库中获取数据并将其加载到我的 Recycler 视图中。

如果您能帮助我,我将不胜感激。

【问题讨论】:

【参考方案1】:

尝试将onCreateViewHolder中的attachToRoot设置为false 将是:

 View contentView = LayoutInflater.from(parent.getContext()).inflate(R.layout.lista, false);

【讨论】:

我刚刚在您回复前几秒钟解决了这个问题,但还是谢谢您!现在我没有错误消息,但我无法获得所需的信息(从我的 SQLite 数据库加载我的回收站视图)。我编辑了帖子以显示此问题,如果您看到我遗漏的内容,请告诉我。 好吧,试着记录一下你从光标处得到的信息,看看到底是哪里出了问题 我该怎么做?运行应用程序时日志中没有消息 @RodrigoPaz 请在您的光标上添加断点并尝试调试代码。然后您可能知道您的光标中有哪些数据。 搜索“Log in android”并在调用光标后放置一条日志消息以了解它是否有数据...在另一个答案中尝试删除 Item item = null;然后在 while 语句中初始化它,例如: Item item = new Item();【参考方案2】:

您正在代码中的某处使用 context.getSystemService。 您使用的上下文为空。

【讨论】:

我搜索了所有代码,但我没有任何 context.getSystemService @RodrigoPaz Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' 这是您遇到的错误。您可能在代码中使用 getSystemService 来运行某种类型的服务。 我解决了这个问题,现在它没有失败,但我还有另一个问题(我编辑了帖子)。当我按下按钮时没有任何反应,它应该使用我的 SQLite 数据库中的信息加载回收器

以上是关于Android Studio - 从 SQLite 数据库加载 RecyclerView 在 Edittext 中输入一个单词的主要内容,如果未能解决你的问题,请参考以下文章

从 Android Studio 中的 SQLite 数据库中以字符串形式检索数据

如何从列表视图中从 sqlite 检索数据单击并查看不同的活动 android studio

如何从android studio中的recycler视图将数据添加到SQLite数据库中

在 Android Studio Kotlin 中从 SQLite 数据库中删除数据

Android Studio - 线程完成后从 SQLite 获取数据

如何从表1中检索列数据并使用SQLite数据库将该列值插入到Android Studio的表2中?