Member 13930815 Ответов: 1

Как получить определенные строки из базы данных sqlite preexisitng в android


Привет,
у меня есть база данных, в которой некоторые случаи равны нулю, если я хочу использовать данные столбца в качестве заголовка(в expendable listview), и если столбец имеет нулевые значения, у меня есть несколько пустых заголовков. как выбрать определенные строки для отображения в качестве заголовка . спасибо

это мое Database.java
package ma.ac.iav.learn;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class Database {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "URTc.db";
    private static final String DATABASE_TABLE = "OrganAnatomy";
    public static final String DATABASE_ID = "_id";
    public static final String DATABASE_GROUP_1 = "Larynx_features";
    public static final String DATABASE_CHILD_1 = "Larynx";
    private final Context mContext;
    private DatabaseHelper mDatabaseHelper;
    private SQLiteDatabase mDB;

    public Database(Context context) {
        mContext = context;
    }

    public void open() {
        mDatabaseHelper = new DatabaseHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION);
        mDB = mDatabaseHelper.getWritableDatabase();
    }


    public void close() {
        if (mDatabaseHelper != null) mDatabaseHelper.close();
    }

    public Cursor getDatabase() {
            return mDB.query(DATABASE_TABLE, null, null, null, null, null, DATABASE_GROUP_1);
    }


    public Cursor getID(long rowID) {
        return mDB.query(DATABASE_TABLE, null, "_id" + " = "
                + rowID , null, null, null, null);

    }

    public class DatabaseHelper extends SQLiteAssetHelper {

        public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);

        }
    }


}


и это моя основная деятельность:
package ma.ac.iav.learn;

import android.content.Context;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ExpandableListView;
import android.widget.SimpleCursorTreeAdapter;

public class MainActivity extends AppCompatActivity {
    ExpandableListView expandableListView;
    Database mDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
             /*
        "Called when the database has been opened."
        https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onOpen(android.database.sqlite.SQLiteDatabase)
         */
        mDatabase = new Database(this);
        mDatabase.open();

        /*
        "This interface provides random read-write access to the result set returned by a database query."
        https://developer.android.com/reference/android/database/Cursor.html
         */

        Cursor cursor = mDatabase.getDatabase();
        startManagingCursor(cursor);

        /*
        "A list of column names that will be used to display the data for a group."
        "The group views (from the group layouts) that should display column in the "from" parameter."
        "A list of column names that will be used to display the data for a child."
        "The resource identifier of a layout file that defines the views for a child."
        https://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html#SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, java.lang.String[], int[], int, java.lang.String[], int[])
         */

        String[] childFrom = new String[]{Database.DATABASE_CHILD_1};
        String[] groupFrom = new String[]{Database.DATABASE_GROUP_1};

        int[] groupTo = {R.id.group1};
        int[] childTo = {R.id.child1};

        /*
        "An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file."
        https://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
        */
        SimpleCursorTreeAdapter simplecursortreeAdapter = new ExpandableListViewAdapter(
                this,
                cursor,
                R.layout.list_group,
                groupFrom,
                groupTo,
                R.layout.list_child,
                childFrom,
                childTo
        );

        /*
        "Finds a view that was identified by the android:id XML attribute that was processed in onCreate(Bundle)."
        "Sets the adapter that provides data to this view."
        https://developer.android.com/reference/android/app/Activity.html#findViewById(int)
        https://developer.android.com/reference/android/widget/ExpandableListView.html#setAdapter(android.widget.ExpandableListAdapter)
         */
        expandableListView = findViewById(R.id.expandableListview);
        expandableListView.setAdapter(simplecursortreeAdapter);

    }

    /*
    "Closes the Cursor, releasing all of its resources and making it completely invalid."
    https://developer.android.com/reference/android/database/Cursor.html#close()
     */
    protected void onDestroy() {
        super.onDestroy();
        mDatabase.close();
    }

    private class ExpandableListViewAdapter extends SimpleCursorTreeAdapter {
        private ExpandableListViewAdapter(
                Context context,
                Cursor cursor,
                int groupLayout,
                String[] groupFrom,
                int[] groupTo,
                int childLayout,
                String[] childFrom,
                int[] childTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo);
        }

        /*
        "Gets the Cursor for the children at the given group."
        https://developer.android.com/reference/android/widget/CursorTreeAdapter.html#getChildrenCursor(android.database.Cursor)
         */
        protected Cursor getChildrenCursor(Cursor groupCursor) {
            return mDatabase.getID(groupCursor.getInt(groupCursor.getColumnIndex(Database.DATABASE_ID)));
        }

    }
}


Что я уже пробовал:

я искал в интернете, но не смог найти четкого ответа

Richard MacCutchan

Вам нужно читать строки, пока вы не найдете столбец, отличный от null. Хотя это не кажется очень хорошим дизайном.

Member 13930815

что вы подразумеваете под чтением строк, объясните подробнее с помощью кода, пожалуйста

Richard MacCutchan

Ну, поскольку я действительно не понимаю, что вы пытаетесь сделать, я не могу дать больше подробностей. Почему вы просто не используете имена столбцов в качестве заголовков?

Member 13930815

Вот моя структура базы данных: https://imgur.com/6eyDx5c как вы можете видеть , некоторые столбцы имеют пустые регистры, и это генерирует либо некоторые пустые чайлды( если я использовал столбцы в качестве заголовков), либо некоторые пустые заголовки(если я использовал содержимое столбца в качестве заголовка), как вы можете видеть здесь https://imgur.com/VNlFtoP (венозный дренаж у пустого ребенка , и я не хочу, чтобы он вообще появлялся)

Member 13930815

я думаю, проблема в том, что я должен использовать оператор if (X != NULL) или что-то еще, но не могу понять, как и правильно ли это делать! пожалуйста помочь

Richard MacCutchan

Вам просто нужно проверить каждый столбец, когда вы добавляете их в представление. Если содержимое равно null, то не создавайте метку элемента.

Member 13930815

я понимаю, что вы имеете в виду, но я использую внешнюю базу данных sqlite ..так как я принимаю то, что вы сказали desgin выше, пожалуйста

Richard MacCutchan

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

1 Ответов

Рейтинг:
0

TheOldFogie

Вы можете использовать SQLite объединяться функция для преобразования нуля в значение.

Например, используя такой запрос, как :-

SELECT
  Organ_features,
	coalesce(Pharynx,'no Pharynx header as null') AS Pharynx, /* replaces null with specified value */
	coalesce(larynx,'no Larynx header as null') AS Larynx /* replaces null with specified value */
FROM OrganAnatomy;


Вышеизложенное привело бы к тому, что :-

Organ_features      Pharynx                   Larynx
 Overview            BLAAAA                      BLALLAL
 Blood Supply        NOOOOO                      SSSSSS
 Venous drain        no Pharynx header as null   SADADJ
 Nerves              sssAAAA                     no Larynx header as null


Альтернативный подход по аналогии как использовать если потом еще положения является использование случае когда тогда еще конце предложения. Аналогичный результат вышеизложенному может быть достигнут с помощью кейсов, которые могут быть :-

SELECT Organ_features,
	CASE WHEN Pharynx IS NULL THEN 'No HDR for Pharynx' ELSE Pharynx END AS Pharynx,
	CASE WHEN Larynx IS NOT NULL THEN Larynx ELSE 'No HDR for Larynx' END AS Larynx
FROM OrganAnatomy;