Как создать и подключить базу данных SQLite - PullRequest
0 голосов
/ 25 сентября 2019

Попытка создать простую базу данных в SQLite и Android Studio, но приложение каждый раз запускает ошибку времени выполнения.

Я построчно следовал руководству, но менял столбцы и информацию в соответствии со своими требованиями..

Если я удалю "myDb = new DatabaseHelper (this);"строка из Main_activity, приложение будет работать.

package com.example.nutriez;

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

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "food.db";
    public static final String TABLE_NAME = "food_table";
    public static final String COL_1 = "FoodName";
    public static final String COL_2 = "Kilojoules";
    public static final String COL_3 = "Carbohydrates";
    public static final String COL_4 = "Protein";
    public static final String COL_5 = "Fat";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        SQLiteDatabase db = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + " (FOODNAME TEXT PRIMARY KEY AUTOINCREMENT, " +
                "KILOJOULES INTEGER, CARBOHYDRATES INTEGER, PROTEIN INTEGER, FAT INTEGER)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
        onCreate(db);
    }
}





package com.example.nutriez;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    DatabaseHelper myDb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDb = new DatabaseHelper(this);
    }
}

Ожидаемый результат - приложение загружается правильно и таблица базы данных создается с использованием набора конструкторов.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2019

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

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL( "CREATE TABLE " + TABLE_NAME + "(" +
        "user_id" + " INTEGER PRIMARY KEY AUTOINCREMENT,"
        +  COL_1 +  " TEXT,"
        +  COL_2 + " TEXT,"
        +  COL_3 + " TEXT,"
        +  COL_4 + " TEXT,"
        +  COL_5 +  " TEXT" + ")");
}
0 голосов
/ 25 сентября 2019

Пожалуйста, изучите этот пример, он отлично работает:

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

public class AppDatabase extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "food.db";
public static final int DATABASE_VERSION = 1;
private static AppDatabase instance = null;
private final Context mContext;

public static final String _ID = "_id";
public static final String TABLE_NAME = "food_table";
public static final String NAME_COLUMN = "FoodName";
public static final String JOULES_COLUMN = "Kilojoules";
public static final String CARBO_COLUMN = "Carbohydrates";
public static final String PROTEIN_COLUMN = "Protein";
public static final String FAT_COLUMN = "Fat";

synchronized static AppDatabase getInstance(Context context) {
    if (instance == null) {
        instance = new AppDatabase(context.getApplicationContext());
        instance.setWriteAheadLoggingEnabled(false);
    }
    return (instance);
}

private AppDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    mContext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_RECORDS_TABLE = "CREATE TABLE " + TABLE_NAME +
            " ( `" + _ID + "` INTEGER, " +
            " `" + NAME_COLUMN + "` TEXT, " +
            " `" + JOULES_COLUMN + "` INTEGER, " +
            " `" + CARBO_COLUMN + "` INTEGER, " +
            " `" + PROTEIN_COLUMN + "` INTEGER, " +
            " `" + FAT_COLUMN + "` INTEGER, " +
            "PRIMARY KEY(`" + _ID + "`) )";
    db.execSQL(CREATE_RECORDS_TABLE);

    String insertName = "INSERT INTO " + TABLE_NAME + " VALUES " +
            " (1,'Pear', 101, 102, 103, 104)"; //Example values
    db.execSQL(insertName);
}

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

}
}

Получите вашу базу данных:

    AppDatabase appDatabase = AppDatabase.getInstance(MainActivity.this);
    SQLiteDatabase db = appDatabase.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    while (cursor.moveToNext()){
        String name = cursor.getString(cursor.getColumnIndex(NAME_COLUMN));
        int kilojoules = cursor.getInt(cursor.getColumnIndex(JOULES_COLUMN));
        int carbohydrates = cursor.getInt(cursor.getColumnIndex(CARBO_COLUMN));
        int protein = cursor.getInt(cursor.getColumnIndex(PROTEIN_COLUMN));
        int fat = cursor.getInt(cursor.getColumnIndex(FAT_COLUMN));
        Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, kilojoules + "", Toast.LENGTH_SHORT).show();
        Toast.makeText(this, carbohydrates + "", Toast.LENGTH_SHORT).show();
        Toast.makeText(this, protein + "", Toast.LENGTH_SHORT).show();
        Toast.makeText(this, fat + "", Toast.LENGTH_SHORT).show();
    }
0 голосов
/ 25 сентября 2019

Иногда в запросе в строке должны быть правильные пробелы. Попробуйте поставить пробел после FAT INTEGER и пробел перед FOODNAME внутри запроса onCreate, чтобы открытые скобки внутри строки были ограничены пробелом,Кроме этого ваш код является стандартным кодом.

...