Android Studio, списки и sqli-базы данных - PullRequest
0 голосов
/ 20 октября 2018

Я новый пользователь android studio и у меня вопрос по списку.Я буду извлекать данные из базы данных, перечислять все действия (действия класса), хранящиеся в базе данных (mapActivity, привлекательные действия и т. Д.Это должно быть указано в основной деятельности.Я надеюсь, вы понимаете, о чем я.я использую базу данных sqlite

// DBhelper

public class DBHelper extends SQLiteOpenHelper {

    private static final String DB_name = "Mydb";
    private static final int DB_version = 1;

    private String createActivityTypeQuery = "CREATE TABLE activity_type (_id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT)";
    private String createpriceQuery = "CREATE TABLE price (_id INTEGER PRIMARY KEY AUTOINCREMENT, price TEXT)";

    private String createActivityQuery = "CREATE TABLE activity (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                                            + "name TEXT,"
                                            + "description TEXT,"
                                            + "type INTEGER,"
                                            + "homePage TEXT,"
                                            + "price INTEGER,"
                                            + "outdoor NUMERIC,"
                                            + "FOREIGN KEY (type) REFERENCES activity_type(_id),"
                                            + "FOREIGN KEY (price) REFERENCES price(_id)"
                                            + ")";

    public DBHelper(@Nullable Context context) {
        super(context, DB_name, null, DB_version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(createActivityTypeQuery);
        db.execSQL(createpriceQuery);
        db.execSQL(createActivitytQuery);

        insertActivityType(db, "Amusement park");
        insertActivityType(db, "Waterpark");
        insertprice(db, "Low");
        insertprice(db, "Medium");
        insertprice(db, "High");
        insertActivity(db, "Thorpe park", "Amusement park in London, United Kingdom. Carousels and roller coaster plus much more", 1, "www.thorpark.uk", 3, true);
        insertActivity(db, "Lee Water Centre", "Lee Water Centre in London, United Kindgom. Lots of water and fun", 2, "www.LeeWaterCentre.uk", 2, true);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    private static void insertActivityType(SQLiteDatabase db, String type) {
        ContentValues activityValues = new ContentValues();
        aktivitetValues.put("type", type);
        db.insert("activity_type", null, activityValues);
    }

    private static void insertprice(SQLiteDatabase db, String price) {
        ContentValues priceValues = new ContentValues();
        priceValues.put("price", price);
        db.insert("price", null, priceValues);
    }

    private static void insertActivity(SQLiteDatabase db, String name, String 
    description, int type, String webPage, int price, boolean outdoor) {
        ContentValues activityValues = new ContentValues();
        activitytValues.put("name", name);
        activitytValues.put("description", description);
        activitytValues.put("type", type);
        activityValues.put("webPage", webPage);
        activitytValues.put("price", price);
        activityValues.put("outdoor", outdoor);
        db.insert("activity", null, activityValues);
    }
}

MainActivity:

public class MainActivity extends AppCompatActivity {

    private SQLiteDatabase db;
    private Cursor cursor;

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

        ListView activitylist = findViewById(R.id.activitylist);

        //Database
        SQLiteOpenHelper dbHelper = new DBHelper(this);


        try {
            db = dbHelper.getReadableDatabase();

            cursor = db.query("activity", new String[] {"_id", "name", "description"}, null, null, null, null, null);
            SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, new String[]{"name", "description"}, new int[]{android.R.id.text1, android.R.id.text2 },0);
            activitylist.setAdapter(listAdapter);
        } catch(SQLiteException e) {
            Toast dbToast = Toast.makeText(this, "Database Unavailable", Toast.LENGTH_SHORT);
            dbToast.show();
        }
    } // end onCreate()

    public void onDestroy() {
        super.onDestroy();
        cursor.close();
        db.close();
    }
}

1 Ответ

0 голосов
/ 21 октября 2018

Похоже, что ваша проблема может быть связана с отсутствием данных в таблице активность из-за отсутствия (в соответствии с созданием SQL таблицы операций) столбца с именем webPage вместо этого вы, вероятно, захотите вставить данные в столбец homePage .

Это хороший пример того, почему рекомендуется определять имена таблиц и столбцов со статической переменной, а затем ВСЕГДА использовать этопеременная для ссылки на таблицу / столбец.

Короткое исправление для вашего решения может состоять в следующем: -

private static void insertActivity(SQLiteDatabase db, String name, String 
description, int type, String webPage, int price, boolean outdoor) {
    ContentValues activityValues = new ContentValues();
    activitytValues.put("name", name);
    activitytValues.put("description", description);
    activitytValues.put("type", type);
    activityValues.put("homePage", webPage); //<<<<<<<<<< CHANGED
    activitytValues.put("price", price);
    activityValues.put("outdoor", outdoor);
    db.insert("activity", null, activityValues);
}

Однако лучшим решением было бы сделать что-то вроде:-

public class DBHelper extends SQLiteOpenHelper {

    private static final String DB_name = "Mydb";
    private static final int DB_version = 1;

    private static TB_ACTIVITY = "activity"; // DEFINED constant variable for the TABLE NAME
    private static ACTIVITY_COL_HOMEPAGE = "homePage"; //<<<<<<<<<< DEFINES constant variable for the COLUMN NAME
    .......... other columns done likewise

    private String createActivityTypeQuery = "CREATE TABLE activity_type (_id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT)";
    private String createpriceQuery = "CREATE TABLE price (_id INTEGER PRIMARY KEY AUTOINCREMENT, price TEXT)";

    private String createActivityQuery = "CREATE TABLE " + TB_ACTIVITY + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, " //<<<<<<<<<< APPLIED constant variable for the TABLE NAME
                                            + "name TEXT,"
                                            + "description TEXT,"
                                            + "type INTEGER,"
                                            + ACTIVITY_COL_HOMEPAGE + " TEXT," //<<<<<<<<<< CHANGED TO USE constant
                                            + "price INTEGER,"
                                            + "outdoor NUMERIC,"
                                            + "FOREIGN KEY (type) REFERENCES activity_type(_id),"
                                            + "FOREIGN KEY (price) REFERENCES price(_id)"
                                            + ")";

    public DBHelper(@Nullable Context context) {
        super(context, DB_name, null, DB_version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(createActivityTypeQuery);
        db.execSQL(createpriceQuery);
        db.execSQL(createActivitytQuery);

        insertActivityType(db, "Amusement park");
        insertActivityType(db, "Waterpark");
        insertprice(db, "Low");
        insertprice(db, "Medium");
        insertprice(db, "High");
        insertActivity(db, "Thorpe park", "Amusement park in London, United Kingdom. Carousels and roller coaster plus much more", 1, "www.thorpark.uk", 3, true);
        insertActivity(db, "Lee Water Centre", "Lee Water Centre in London, United Kindgom. Lots of water and fun", 2, "www.LeeWaterCentre.uk", 2, true);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    private static void insertActivityType(SQLiteDatabase db, String type) {
        ContentValues activityValues = new ContentValues();
        aktivitetValues.put("type", type);
        db.insert("activity_type", null, activityValues);
    }

    private static void insertprice(SQLiteDatabase db, String price) {
        ContentValues priceValues = new ContentValues();
        priceValues.put("price", price);
        db.insert("price", null, priceValues);
    }

    private static void insertActivity(SQLiteDatabase db, String name, String 
    description, int type, String webPage, int price, boolean outdoor) {
        ContentValues activityValues = new ContentValues();
        activitytValues.put("name", name);
        activitytValues.put("description", description);
        activitytValues.put("type", type);
        activityValues.put(ACTIVITY_COL_HOMEPAGE, webPage); //<<<<<<<<<<
        activitytValues.put("price", price);
        activityValues.put("outdoor", outdoor);
        db.insert(TB_ACTIVITY, null, activityValues); //<<<<<<<<<<
    }
}
  • Обратите внимание, что приведенный выше код является принципиальным кодом, он не был проверен и поэтому может иметь некоторые незначительные ошибки.
  • Ошибкабыла обнаружена первая ошибка, нет гарантии, что других ошибок не существует.
  • См. все строки, отмеченные //<<<<<<<<<<
  • Константа была применена только для homePage столбец, в идеале вы должны сделать то же самое для всех столбцов, если принимаете этот лучший подход.В идеале вы должны сделать константы общедоступными , после чего их можно будет использовать в другом месте, например,
    • cursor = db.query("activity", new String[] {"_id", "name", "description"}, null, null, null, null, null);
    • может стать (при условии, что для констант использовалось соглашение об именовании, приведенное выше) cursor = db.query(DBHelper.TB_ACTIVITY, new String[] {DBHelper.ACTIVITY_ID,DBHelper.NAME,DBHelper.DESCRIPTION}, null, null, null, null, null);
...