Есть ли способ отображения всех таблиц и содержимого sqlite с помощью списка просмотра? - PullRequest
0 голосов
/ 24 мая 2018

Я сделал небольшой инструмент для получения всей информации из базы данных во время выполнения.Вот мой код:

пакет 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>

Все это делается вручную (с использованием вложенных LinearLayouts).Производительность очень хорошая на моем Huawei p8.Если ни одна из опций списка или повторного просмотра не является опцией, возможно, этот код может быть кому-то полезен.

1 Ответ

0 голосов
/ 24 мая 2018

Ответ Да как: -

У меня есть инструмент, который я называю SQLiteInfoAssistant, который разработан как модуль и будет отображать информацию и базовые данные для нескольких баз данных, если они существуют.

Информация отображается в 3 ListView.2 бок о бок вверху, которые первоначально отображают базы данных в верхнем левом представлении и таблицы в выбранной базе данных в верхнем правом представлении

В этом начальном виде различная информация о базе данных отображается в виде снизу.Например, путь вместе с различной другой информацией, полученной с помощью прагмы.

При щелчке по таблице таблицы базы данных затем отображаются в левом верхнем представлении, а столбцы - в верхнем правом.В нижнем представлении отображается имя информации о таблице, SQL, использованный для создания таблицы, количество столбцов и количество столбцов в первичном ключе.

В любом из представленных выше представлений при длительном щелчке по таблице будут отображаться фактические данные (BLOB-объекты усекаются и отображаются в виде шестнадцатеричного представления).

Вот некоторые снимки экрана: -

База данных и таблицы

  • (обратите внимание, что база данных testDB001 была нажата, поскольку только emptydb001 имеетandroid_metadata): -

enter image description here

Таблица и столбцы

enter image description here

Данные в таблице

enter image description here

  • Можно прокручивать по горизонтали и вертикали.

Вызов может быть какпросто включив модуль, создав экземпляр SQLiteInformationAssistan t, передающий контекст , а затем используя метод show.Тем не менее, многие настройки могут быть сделаны, как видно из комментариев в следующем коде вызова: -

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, DB Browser для Sqlite, менеджер SQLite и т. д.).Полный код, вероятно, будет слишком велик для размещения здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...