【问题标题】:Is there a way of displaying all sqlite tables and contents by using listview?有没有办法使用 listview 显示所有 sqlite 表和内容?
【发布时间】:2018-05-24 19:38:44
【问题描述】:

我制作了一个小工具,用于在运行时从数据库中获取所有信息。这是我的代码:

包 com.example.helix.whiffs;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class FragmentDatabase extends Fragment{

    private final String LOG_TAG = "FRAGMENTDATABASE";

    DatabaseListener listener;

    int rowHeight = 40;
    String text;

    Button select;
    TextView counter;
    LinearLayout titleBar;
    LinearLayout dataList;
    PopupMenu popup;

    String[] fields;
    int[] colWidths;
    List<String> data;
    HashMap<Integer, String[]> dataItems;
    HashMap<Integer, String> menuItems;

    DBAdapter db;
    public interface DatabaseListener{
        void onload(String table);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View v = inflater.inflate(R.layout.fragment_database, container, false);
        select = (Button)v.findViewById(R.id.select);
        counter = (TextView)v.findViewById(R.id.count);
        titleBar = (LinearLayout)v.findViewById(R.id.titles);
        dataList = (LinearLayout) v.findViewById(R.id.list);

        data = new ArrayList<>();
        menuItems = new HashMap<>();
        dataItems = new HashMap<>();

        db = new DBAdapter(getActivity().getApplicationContext());
        data = db.allTables();

        popup = new PopupMenu(getActivity().getApplicationContext(), select);
        for(int i = 0; i < data.size(); i++) {
            popup.getMenu().add(Menu.NONE, i, i, data.get(i));
            menuItems.put(i, data.get(i));
        }

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                dataList.removeAllViews();
                titleBar.removeAllViews();
                dataItems.clear();

                int itemId = menuItem.getItemId();
                String table = menuItems.get(itemId);
                fields = db.allFields(table);
                TextView idField = new TextView(getActivity().getApplicationContext());
                idField.setText(fields[0]);
                titleBar.addView(idField);
                colWidths = new int[fields.length];
                colWidths[0] = 80;
                for(int i = 1; i < fields.length; i++){
                    colWidths[i] = 200;
                    TextView f = new TextView(getActivity().getApplicationContext());
                    String text = fields[i];
                    f.setText(text);
                    titleBar.addView(f);
                }

                dataItems = db.allValues(table);
                counter.setText(String.valueOf(dataItems.size()));

                for(int i = 0; i < dataItems.size(); i++){

                    LinearLayout row = new LinearLayout(getActivity().getApplicationContext());
                    row.setOrientation(LinearLayout.HORIZONTAL);

                    String[] rowData = dataItems.get(i);

                    TextView idf = new TextView(getActivity().getApplicationContext());
                    if(rowData.length != 0) idf.setText(rowData[0]);
                    row.addView(idf);

                    for(int j = 1; j < rowData.length; j++){
                        TextView idf2 = new TextView(getActivity().getApplicationContext());
                        text = rowData[j];
                        row.addView(idf2);

                        if(text != null && text.length() > 9){
                            int length = 18 * text.length();
                            if(colWidths[j] < length) colWidths[j] = length;
                        }
                        idf2.setText(text);
                    }
                    dataList.addView(row);
                }

                for(int j = 0; j < colWidths.length; j++){
                    TextView tv = (TextView) titleBar.getChildAt(j);
                    ViewGroup.LayoutParams vlp = tv.getLayoutParams();
                    vlp.width = colWidths[j];
                    vlp.height = rowHeight;
                    tv.setLayoutParams(vlp);
                }
                for(int i = 0; i < dataItems.size(); i++){
                    LinearLayout rowLayout = (LinearLayout) dataList.getChildAt(i);
                    for(int j = 0; j < colWidths.length; j++){
                        TextView tv = (TextView) rowLayout.getChildAt(j);
                        ViewGroup.LayoutParams vlp = tv.getLayoutParams();
                        vlp.width = colWidths[j];
                        vlp.height = rowHeight;
                        tv.setLayoutParams(vlp);
                    }
                }
                return true;
            }
        });

        select.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                popup.show();
            }
        });
        return v;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof FragmentDatabase.DatabaseListener) {
            listener = (FragmentDatabase.DatabaseListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement FragmentListener");
        }
    }

    @Override
    public void onDetach() {
        listener = null;
        super.onDetach();
    }
}

这是我的数据库适配器的重要部分:

myDbHelper myhelper;

public List<String> allTables(){
        List<String> result = new ArrayList<>();
        SQLiteDatabase db = myhelper.getWritableDatabase();
        Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type = 'table'",null);
        if(c.moveToFirst()){
            while (!c.isAfterLast()){
                result.add(c.getString(0));
                c.moveToNext();
            }
        }
        return result;
    }

    public String[] allFields(String table){
        List<String> result = new ArrayList<>();
        SQLiteDatabase db = myhelper.getWritableDatabase();
        Cursor c = db.query(table, null, null, null, null, null, null);
        return c.getColumnNames();
    }

    public HashMap<Integer, String[]> allValues(String table) {
        HashMap<Integer, String[]> result = new HashMap<>();
        String[] row;

        SQLiteDatabase db = myhelper.getWritableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM "+table, null);
        int columns = c.getColumnCount();
        if(c.moveToFirst()){
            int rowCount = 0;
            while(!c.isAfterLast()){
                row = new String[columns];
                for(int i = 0; i < columns; i++){
                    row[i] = c.getString(i);
                    Log.i(LOG_TAG, "Row add "+String.valueOf(c.getString(i)));
                }
                result.put(rowCount, row);
                rowCount ++;
                c.moveToNext();
            }
        }
        return result;
    }

static class myDbHelper extends SQLiteOpenHelper
    {
    private Context context;

        public myDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_Version);
            this.context=context;
            onCreate(this.getWritableDatabase());
        }
    }
}

最后是片段的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:id="@+id/top_bar"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="#888888"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/select"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:text="table"/>
        <TextView
            android:id="@+id/count"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:text="total"
            android:textSize="24sp"
            android:gravity="center_horizontal"
            android:layout_marginTop="5dp"/>
    </LinearLayout>
    <HorizontalScrollView
        android:layout_below="@+id/top_bar"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >
            <LinearLayout
                android:id="@+id/titles"
                android:background="#777777"
                android:layout_width="match_parent"
                android:layout_height="36dp"
                android:orientation="horizontal">
            </LinearLayout>
            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <LinearLayout
                    android:id="@+id/list"
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1">

                </LinearLayout>
            </ScrollView>
        </LinearLayout>
    </HorizontalScrollView>
</RelativeLayout>

这一切都是手动完成的(使用嵌套的线性布局)。在我的华为 p8 上性能非常好。如果没有 list- 或 recyclerview 选项不是一个选项,那么这段代码可能对某人有用。

【问题讨论】:

    标签: java android database list sqlite


    【解决方案1】:

    答案是肯定的:-

    我有一个名为 SQLiteInfoAssistant 的工具,它被设计为一个模块,如果存在多个数据库,它将显示信息和基础数据。

    信息显示在 3 ListView 中。 2 在顶部并排显示,最初在左上视图中显示数据库,在右上视图中显示所选数据库中的表。

    在这个初始视图中,各种数据库信息显示在底部视图中。例如路径以及通过 pragma 获得的各种其他信息。

    单击表时,数据库的表将显示在左上角视图中,列显示在右上角视图中。下视图显示表信息名称、用于创建表的 SQL、列数和主键中的列数。

    在上述任一视图中,长按表格将显示实际数据(blob 被截断并显示为十六进制表示)。

    以下是一些屏幕截图:-

    数据库和表格

    • (注意数据库testDB001已被点击,因为emptydb001只有android_metadata):-

    表格和列

    表格中的数据

    • 可以水平和垂直滚动。

    调用可以像包含模块一样简单,通过 context 创建SQLiteInformationAssistant 的实例,然后使用show 方法。但是,可以进行许多自定义,如 cmets 在以下调用代码中所见:-

    private void tryitout() {
        // Get an SQLiteInformationAssistant instance
        // Note! the show method invokes the Activity
        SQLiteInformationAssistant SIA = new SQLiteInformationAssistant(this);
    
        // Instance customisation i.e set Display attributes
        //SIA.setBaseBackgroundColour(0xFFFFFFFF);
        //SIA.setHeadingTextColour(0xFFFFFF00);
        //SIA.setDatabaseListHeadingTextColour(0xFFFFFF00);
        //SIA.setTableListHeadingTextColour(0xFF0077FF);
        //SIA.setColumnListHeadingTextColour(0xFF77FF00);
    
        //SIA.setDatabaseListTextColour(0xFFFFFFFF);
        //SIA.setDatabaseInfoTextColour(0xFFFF0000);
        //SIA.setDatabaseListBackgroundColour(0xFFFFFF00);
        //SIA.setDatabaseInfoBackgroundColour(0xFFFFFF00);
        //SIA.setDatabaseInfoHeadingTextColour(0xFFFF0000);
    
        //SIA.setTableListTextColour(0xFFFF00FF);
        //SIA.setTableInfoTextcolour(0xFF0000FF);
        //SIA.setTableListBackgroundColour(0xFFFFFF00);
        //SIA.setTableInfoBackgroundColour(0xFFFFFF00);
        //SIA.setTableInfoHeadingTextColour(0xFFFF00FF);
    
        //SIA.setColumnListTextColour(0xFFFFFF00);
        //SIA.setColumnInfoTextColour(0xFF000000);
        //SIA.setColumnListBackgroundColour(0xFFFFFF00);
        //SIA.setColumnInfoBackgroundColour(0xFFFFFF00);
        //SIA.setColumnInfoHeadingTextColour(0xFF00FF00);
    
        //SIA.setStringCellBackgroundColour(0xFFEEEEEE);
        //SIA.setStringCellTextColour(0xFF0000FF);
        //SIA.setIntegerCellBackgroundColour(0xFFFF0000);
        //SIA.setIntegerCelltextColour(0XFFFFFFFF);
        //SIA.setDoubleCellBackgroundColour(0xFF00FFFF);
        //SIA.setDoubleCelltextColour(0XFF5555FF);
        //SIA.setBlobCellBackgroundColour(0xFF44FF55);
        //SIA.setBlobCelltextColour(0xFFFFFF00);
        //SIA.setUnkownCelltextColour(0xFFFFFF00);
        //SIA.setUnknownBackgroundCellColour(0xFFFF0000);
        // Note
        //SIA.setBytesToShowInBlob(128);
        SIA.show();
    }
    

    我实际上并没有发布或提供它,但如果有人感兴趣,我可以提供代码,这主要是因为我自己很少使用它,因为只需将数据库复制到一个免费提供的 SQLite 中就很容易了工具(Navicat、SQLite 数据库浏览器、SQLite 管理器等)。完整的代码可能太大,无法在此处发布。

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多