Android Studio, Java и SQLite проблема создания базы данных - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема в том, что когда я пытаюсь выполнить запрос, он не имеет доступа к части команды execSQL, я застрял на ней около часа.

package com.androstock.myweatherapp;

import android.database.sqlite.SQLiteDatabase;

import static android.database.sqlite.SQLiteDatabase.openOrCreateDatabase;

public class Database {
    SQLiteDatabase mydatabase = openOrCreateDatabase("database.db", null);

    public void onCreate() {
        mydatabase.execSQL("CREATE TABLE IF NOT EXISTS TutorialsPoint(Username VARCHAR,Password VARCHAR);");
        mydatabase.execSQL("INSERT INTO TutorialsPoint VALUES('admin','admin');");
    }
}    

Если кто-томог бы пролить некоторый свет на то, где я ошибаюсь, это было бы здорово, спасибо заранее

1 Ответ

0 голосов
/ 03 декабря 2018

Вы немного запутались с вашим кодом.

Я бы предложил расширить класс База данных (быть подклассом) класса SQLiteOpenHelper и переопределение метода onCreate для создания таблиц в базе данных.

например

public class Database extends SQLiteOpenHelper {

    // define constants so all names can be defined just once 
    public static final String DBNAME = "database.db"; // The database name
    public static final int DBVERSION = 1; // The version (increase it to invoke the onUpgrade method to alter the DB structure)
    public static final String TABLE_TUTORIALSPOINT = "tutorialspoint"; // The table name
    public static final String COLUMN_USERNAME = "username"; // Columns
    public static final String COLUMN_PASSWORD = "password";

    SQLiteDatabase mDB; //Variable to hold the SqliteDatabase

    //The Database class constructor
    public Database(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase(); //<<<<<<<<<< store the Sqlite Database opening it, (if it doesn't exist then onCreate will be called) 
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_tutorialspoint_table = "CREATE TABLE IF NOT EXISTS " + TABLE_TUTORIALSPOINT + "(" +
                COLUMN_USERNAME + " VARCHAR, " +
                COLUMN_PASSWORD + " VARCHAR" +
                ")";
        db.execSQL(crt_tutorialspoint_table); // Create the table
        // Preapre to insert a row using the SQLiteDatabase convenience insert method
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_USERNAME,"admin");
        cv.put(COLUMN_PASSWORD,"admin");
        db.insert(TABLE_TUTORIALSPOINT,null,cv);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    }
}

Затем вы можете использовать это в действии;что-то вроде: -

public class MainActivity extends AppCompatActivity {

    Database mMYDatabaseHelper; // Declare a Database object called mMyDatabaseHelper <<< Note will be null untill instantiated (constructed)
    SQLiteDatabase mMySQliteDatabase; // Declares an SQliteDatabase object again will be null

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

        mMYDatabaseHelper = new Database(this); // Construct the mMyDatabaseHelper (will create the database an insert the row)
        mMySQliteDatabase = mMYDatabaseHelper.getWritableDatabase(); // Set/assign sqlite database from the helper to the SqliteDatabase object

        // retrieve the rows in the table into a Cursor so the data can be extracted
        // Note how the names are obtained from the constants as setup in the Database class.
        Cursor mycursor = mMySQliteDatabase.query(Database.TABLE_TUTORIALSPOINT,null,null,null,null,null,null);
        // loop through all rows of the cursor
        while (mycursor.moveToNext()) {

            String username = mycursor.getString(mycursor.getColumnIndex(Database.COLUMN_USERNAME)); // get the username from the current row
            String password = mycursor.getString(mycursor.getColumnIndex(Database.COLUMN_PASSWORD)); // get the password from the current row
            Log.d("TABLEINFO", "Row " + String.valueOf(mycursor.getPosition() + 1) + " has a username of " + username + " and a password of " + password);
        }
        mycursor.close(); // Done with the Cursor so close it

        //ALL DONE if there are any rows in the table then there should be some output in the Log.
}
  • Обратите внимание, что обычно у вас есть метод в классе Database (или в другом месте, определяемый соглашениями о кодировании), который возвращает Cursor, а не обращается к базе данных в действиях.

Вывод в журнал: -

D/TABLEINFO: Row 1 has a username of admin and a password of admin
...