【问题标题】:How to read from a SQLite Database and pass the value to a textview in another Class如何从 SQLite 数据库中读取并将值传递给另一个类中的文本视图
【发布时间】:2013-04-30 14:02:33
【问题描述】:

我对 Android 还很陌生。我正在制作一个应用程序,该应用程序在先前和向前按钮单击时显示大量不同的刺痛。我还有一个存储在资产文件夹中的数据库。现在我对如何在 Ecilipse 中从该数据库中读取 tdo 并将其传递到 textview 感到有些困惑。另外,是否可以一一显示字符串。就像它发生在数组中一样?

DataBaseCreator.java

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class DataBaseCreator extends SQLiteOpenHelper {
    private static String DB_PATH = "/GetInspiredAndHaveFun/assets/Jokes.db";
    private static String DB_NAME = "Jokes.db";
    private static int DB_VERSION = 1;
    public static String DATABASE_TABLE = "myjoke";
    public String temp = "";
    public String[] col;


    private SQLiteDatabase myDataBase;
    private final Context myContext;

    public DataBaseCreator(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.myContext = context;

    }



    public void openDatabase() throws IOException {
        boolean dbe = checkDataBase();
        if (dbe) {
            Log.i("Tag", "dbe" + dbe);

        } else {
            Log.i("Tag", "dbdoesnotexist" + dbe);
            this.getReadableDatabase();
            copyDataBase();

        }

    }

    public void copyDataBase() throws IOException {
        InputStream inp = myContext.getAssets().open(DB_NAME);
        String ofn = DB_PATH + DB_NAME;
        OutputStream oup = new FileOutputStream(ofn);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inp.read(buffer)) > 0) {
            oup.write(buffer, 0, length);
        }

        oup.flush();
        inp.close();
        oup.close();

    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;

            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);
        }

        catch (SQLiteException e) {

        }

        return checkDB != null ? true : false;
    }

    public void openDataBase() throws SQLException {

        // Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
        passText();

    }

    public final String passText() {
        Cursor cursor = myDataBase.query(DATABASE_TABLE, col, null, null,
                null, null, null);
        String[] column = cursor.getColumnNames();
        column=col;


        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            temp += cursor.getString(50);
            cursor.moveToNext();

        }

        return temp;

    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

笑话活动

    import java.io.IOException;

    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.content.Context;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.View;
    import android.widget.ImageButton;
    import android.widget.TextView;
    import android.widget.Toast;




    public class Jokes extends Activity {

        ImageButton bck, fwd, cpy, col;

        TextView t1;

        String[] jok;
        int i, a3;
        TextView nm1;

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

..
...
...
...
..

.

 }

        {

            DataBaseCreator myDbHelper = new DataBaseCreator(this);

            try{
                myDbHelper.copyDataBase();
            } 
            catch (IOException ioe) {
                throw new Error("Unable to create database");
            }

            myDbHelper.openDataBase();



        }

        }

【问题讨论】:

  • 你能在你的代码中展示你到目前为止做了什么吗?所以我可以指导你。
  • 我编辑了我的帖子。看看吧。
  • 您能否详细说明您想要进入的流程。请给我一个概述,您的代码应该如何工作。
  • 我想要它做的是读取所有内容,即我存储在数据库中的所有字符串。然后,当用户按下前进按钮时,它会显示数据库中的第一个条目。在上一个按钮上单击它会显示数据库中的上一个条目。简单的!然而复杂。
  • 如果我没记错的话,我理解的是,当用户点击按钮时,它应该转到下一个活动,在该活动中显示一个文本视图(用于显示字符串)和两个按钮(上一个和下一个显示上一个和下一个字符串)。我说的对吗?

标签: java android coding-style android-sqlite


【解决方案1】:

您可以通过在数据库中使用游标来获取对象集合(在您的情况下为笑话),然后您可以迭代您的集合并使用意图将对象(可序列化)发送到另一个活动。

【讨论】:

  • 看看this code,它完全符合您的要求。
  • 它不/它向数据库添加值。我想要的是将数据库与我的应用程序捆绑在一起,让应用程序完成其余的工作。我不希望我的用户自己添加每一个报价。我应该为他们这样做。
  • 无论如何,你能告诉我如何使用我自己的数据库,而不是在应用程序中创建一个数据库,然后使用与在应用程序中显示引号相同的其他代码(你提到的)。跨度>
【解决方案2】:

你可以通过这个:Android: Accessing assets folder sqlite database file with .sqlite extension

这肯定会对你有所帮助。我确定。

编辑:

我现在没时间了。所以,我无法为您提供完整的代码,但线框肯定会帮助您。我们就是这样走的:

在您尝试显示数据的活动中,首先获取您要显示的所有数据并存储在一个数组列表中(假设:您要显示的数据仅来自单个列,否则,您需要创建一个将存储多个列中的值的类,然后创建该类的arrayList 例如:如果您需要创建一个类 Student{int roll_no, String name, int age},那么您需要创建该类的 ArrayList输入学生,ArrayList<Student>)

现在初始化一个值为 1 的 int var,例如 int index_counter = 1;

现在,您正在以线性方式遍历字符串,因此创建一个参数为整数的函数,您将在其中根据按钮或图像视图单击设置文本。

函数如下所示:

set_data(int index) { textView.setText(arraylist.get(index)); }

您的onClick() 事件将如下所示:

fwd.setOnClickListener(new OnClickListener
public void onClick(View v)
{
index_counter = index_counter + 1;

if(index_counter == arraylist.size)
{
 fwd.setEnabled(false);
}

set_data(indexCounter);
}
);

bck.setOnClickListener(new OnClickListener
public void onClick(View v)
{
index_counter = index_counter - 1;

if(index_counter == 1)
{
 bck.setEnabled(false);
}

set_data(indexCounter);
}
);

你已经完成了......当然,不要忘记在onCreate() 中调用set_data(1);,因为当你第一次参加这个活动时,你需要将arraylist 中的第一个数据设置为默认显示。在执行此操作之前,您的数组列表应通过从数据库中获取数据来填充..

我认为,现在,您准备申请就足够了。好的...但是即使那样,如果您有任何疑问,也可以问我。

PS:输入代码时可能会出现一些错误,因为我在这里直接编写了代码。无需在任何地方输入。所以请改正。还有运气……

【讨论】:

  • 您所问的所有子问题的答案是,是的,您所问的一切都是可能的。重要的事情应该明确的实施方式。
  • 是的! :) 谢谢。无论如何,请查看我的其他评论。
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多