通过另一个类中的列表输出数据库信息 - Eclipse Android SQLite

Posted

技术标签:

【中文标题】通过另一个类中的列表输出数据库信息 - Eclipse Android SQLite【英文标题】:Outputting database information through a list in another class - Eclipse Android SQLite 【发布时间】:2016-05-20 02:09:37 【问题描述】:

我已经建立了 3 个类,1) tableStudents 2) DB 3) MainActivity

到目前为止,代码成功地创建了一个数据库,并将给定的一组编码测试数据插入到数据库中。但是我不知道如何打印这些信息只是为了表明它确实已经成功输入了。

我在大学计算机上,因此无法访问数据库文件

在不浏览文件的情况下,我尝试使用我为获取数据而编写的方法输出列表,但我不确定如何将其物理输出为文本。

完整代码如下:

tableStudents.java

public class tableStudents 
     public String name, gender, password, course, modules;
        public int age;
    //Constructor
    public tableStudents()
    

    

     //constructor
    public tableStudents(String name, String gender, int age, String password, String course, String modules)
    
        this.name = name;
        this.password = password;
        this.gender = gender;
        this.age = age;      
        this.course = course;
        this.modules = modules;
    


    public static abstract class tableColumns implements BaseColumns
    
        public static final String Student_ID= "Student_ID";
        public static final String Student_Name= "Student_Name";
        public static final String Student_Password = "Student_Password";
        public static final String Student_Gender = "gender";
        public static final String Student_Age = "age";
        public static final String Student_Course = "course";
        public static final String Modules = "modules";
        public static final String Database = "databasename";
        public static final String Table = "tablename";
    



DB.java

public class DB extends SQLiteOpenHelper 
    public static final int db_version = 1;  
    public static final String Table = "Students";  
    public static final String Student_ID = "Student_ID";
    public static final String Student_Name = "Student_Name";
    public static final String Student_Password = "Student_Password";
    public static final String Student_Gender = "gender";
    public static final String Student_Age = "age";
    public static final String Student_Course = "course";
    public static final String Modules = "modules";
    public DB(Context context) 
        super(context, tableColumns.Database, null, db_version);
    

    @Override
    public void onCreate(SQLiteDatabase db) 
        //Create Table
        db.execSQL("CREATE TABLE " + Table + "(" + 
                Student_ID + " INTEGER PRIMARY KEY, " +
                Student_Name + " TEXT, " +
                Student_Password + " TEXT, " +
                Student_Gender + " TEXT, " +
                Student_Age + " INTEGER, " +
                Student_Course + " TEXT, " +
                Modules + " TEXT)");
        Log.d("DB", "DB Created");      
    

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        db.execSQL("DROP TABLE IF EXISTS " + Table);
        onCreate(db);
    

    public List<tableStudents> getData() 
        List<tableStudents> studentList = new ArrayList<tableStudents>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + Table;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // looping through all rows and adding to list
        if (cursor.moveToFirst()) 
            do 
                tableStudents student = new tableStudents();
                student.name = cursor.getString(0);
                student.password = cursor.getString(1);
                student.gender = cursor.getString(2);
                student.age = Integer.parseInt(cursor.getString(3));          
                student.course = cursor.getString(4);
                student.modules = cursor.getString(5);
                studentList.add(student);
             while (cursor.moveToNext());
        
        // return contact list
        return studentList;
    


    public boolean insertStudent(String name, String gender, int age, String password, String course, String modules) 
        SQLiteDatabase db = getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(Student_Name, name);
        contentValues.put(Student_Password, password);
        contentValues.put(Student_Gender, gender);
        contentValues.put(Student_Age, age);        
        contentValues.put(Student_Course, course);
        contentValues.put(Modules, modules);
        Log.d("DB", "Inserted Successfully");
        return true;
    


MainActivity.java

public class MainActivity extends Activity 

    Intent appIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        DB db = new DB(this);
        db.insertStudent("T", "T", 5, "T", "T", "T");
        List<tableStudents> outputList = db.getData();     
    

    public void goHomepage(View v)
    
        Intent intent = new Intent(MainActivity.this, Homepage.class);
        startActivity(intent);
    
    public void goAccount(View v)
    
        Intent intent = new Intent(MainActivity.this, MyAccount.class);
        startActivity(intent);
       

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in androidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) 
            return true;
        
        return super.onOptionsItemSelected(item);
    

【问题讨论】:

使用SELECT 检索您的数据并与原始数据进行比较? 我在 DB.java 中的 getData 方法有那个伙伴 那么你缺少的部分是什么?您是否需要向其他人提供输出以证明您的代码有效?如果是这样,只需 Log 您的数据。 我只是想看看插入的信息并证明它已被插入到数据库中以便我自己识别,谢谢 【参考方案1】:

好吧,您有一个List,因此您可以使用ListView 显示相应的数据。如果您只是想查看从 getData 返回的数据,您可以循环遍历数组并将 Log 它发送到您的 logcat 输出。

for (tableStudents student: outputList) 
    // Log your results.
    Log.d("result_list", student.toString())

如果您想在您的应用中显示此信息,您可以使用ListView。 Android 为任意数据和列表视图提供了一个基本接口,您可以根据需要对其进行扩展和自定义,称为BaseAdapter。他们还提供了BaseAdapter 的具体实现,供您轻松使用。

一个这样的实现是ArrayAdapter 类。 (See here)这个类描述如下:

由任意对象数组支持的具体 BaseAdapter。默认情况下,此类期望提供的资源 id 引用单个 TextView。如果您想使用更复杂的布局,请使用同样采用字段 id 的构造函数。该字段 id 应引用较大布局资源中的 TextView。

无论如何引用 TextView,它都会被数组中每个对象的 toString() 填充。您可以添加自定义对象的列表或数组。覆盖对象的 toString() 方法以确定列表中的项目将显示哪些文本。

因此,您可以在 Activity 的布局文件中创建一个ListView,为其指定一个 ID,然后创建一个适配器来为该 ListView 供电。例如:

首先在您的活动 xml 文件中创建列表视图。

activity_main.xml

<ListView
    android:id="@+id/my_list_view"
    android:layout_
    android:layout_ />

一旦定义,您应该重写 tableStudents.toString() 方法并实现一个用户友好的版本,将相关字段显示为字符串。

tableStudents.java(通常,您应该避免这样做,而是扩展ArrayAdapter,然后覆盖getView() 并在那里显示对象的属性)

@Override
public String toString() 
    StringBuilder out = new StringBuilder();
    out.append("Student: ")
    out.append(this.name);
    // etc.
    return out.toString();

现在在您调用getData() 后的活动中,引用ListView 并创建ArrayAdapter

MainActivity.java

List<tableStudents> outputList = db.getData();

// Reference the list view.
ListView listView = (ListView) findViewById(R.id.my_list_view);

// Create the adapter.
ArrayAdapter listViewAdapter = new ArrayAdapter(
        this, 
        android.R.layout.simple_list_item_1,
        android.R.id.text1,
        outputList
);

// Then set the adapter for the list view.
listView.setAdapter(listViewAdapter);

您的数据库结果应该显示在您应用中一个漂亮的可滚动列表中。

希望对您有所帮助,如果您有任何问题,请告诉我。

【讨论】:

感谢您非常有用的回答!我将能够在几个小时内对其进行测试,所以请耐心等待。再次感谢。

以上是关于通过另一个类中的列表输出数据库信息 - Eclipse Android SQLite的主要内容,如果未能解决你的问题,请参考以下文章

将列表视图绑定到另一个类中的属性

如何在 ReactJS 中的另一个类中呈现类列表?

c++ 类中的意外输出并将对象复制到另一个对象

通过函数访问另一个类中的私有结构 LinkedList;

如何从另一个类中调用 onItemClick 方法?

在Scrapy类中更正来自多个解析def的输出