таблица не создается в моей базе данных (SQLite), тост показывает успех - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь заставить это приложение добавлять значения в базу данных через SQLiteDATABASE и, наконец, отображать их, но всякий раз, когда я запускаю это приложение и добавляю некоторые данные, я получаю тост за успех, но когда я проверяю в диспетчере устройствчерез студию я получаю эту пустую базу данных ... в ней не было создано ни одной таблицы ... я много пытался сделать эту работу, я думал, что это потому, что метод onCreate не вызывался .. поэтому я попытался удалить предыдущую базу данныхи начал заново .. но я все еще получаю пустую базу данных ... logcat также выглядит хорошо ...

помогите мне, пожалуйста ...

Вот мой класс DBHelper

package com.example.ankur.login;

import android.content.ContentValues;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DBAdapter extends SQLiteOpenHelper {

public static final String DB_name="seminar2.db";
public static final String TABLE_name="seminar";
public static final String col1="Date";
public static final String col2="Department";
public static final String col3="Topic";
public static final String col4="Speaker";
public static final String col5="No_of_Students";
public static final String col6="Guests";
public static final String col7="Organisation";
public DBAdapter(Context context) {
    super(context, DB_name, null, 1);
    SQLiteDatabase db=this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {
    String query ="create table "+TABLE_name+" (SEM_ID INTEGER PRIMARY KEY AUTOINCREMENT, "+col1+" date, "+col2+" varchar(15), "+col3+" varchar(15), "+col4+" varchar(15), "+col5+" NUMBER(100), "+col6+" varchar(15), "+col7+ " varchar(15) "+" );";
    db.execSQL(query);
}

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

public boolean insetDATA(String date,String dept,String topic,String fkin_guests,String orgy,String speakr,int no){

    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues cv=new ContentValues();
    cv.put(col1,date);
    cv.put(col2,dept);
    cv.put(col3,topic);
    cv.put(col4,speakr);
    cv.put(col5,no);
    cv.put(col6,fkin_guests);
    cv.put(col7,orgy);

    long result=db.insert(TABLE_name,null,cv);
    if(result==-1)
        return false;
    else
        return true;
}
}

Вот моя деятельность ДОБАВИТЬ

package com.example.ankur.login;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class ADD extends AppCompatActivity{    
DBAdapter myDB;
EditText date,topic,dept,speaker,guests,org,students;
Button addy;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add);
    myDB=new DBAdapter(this);


    date=findViewById(R.id.ID_date);
    topic=findViewById(R.id.ID_topic);
    dept=findViewById(R.id.ID_Dept);
    speaker=findViewById(R.id.ID_Speaker);
    guests=findViewById(R.id.ID_Guests);
    org=findViewById(R.id.ID_Org);
    students=findViewById(R.id.ID_No);
    addy=findViewById(R.id.BUTTON_Add);
    add();
}
public void add()
{
    addy.setOnClickListener(
            new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    boolean isInserted=myDB.insetDATA(date.getText().toString(),dept.getText().toString(),topic.getText().toString(),guests.getText().toString(),org.getText().toString(),speaker.getText().toString(),Integer.parseInt(students.getText().toString()));
                    if(isInserted)
                        Toast.makeText(ADD.this,"Success",Toast.LENGTH_LONG).show();
                    else
                        Toast.makeText(ADD.this,"FAIL!!",Toast.LENGTH_LONG).show();
                }
            }
    );
}
}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Я полагаю, что ваша проблема в том, как / что вы используете для просмотра базы данных.Я скопировал ваш код и запустил его, и он отлично работает.

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

Сначалановый метод в классе DBAdapter , он извлечет все строки в Курсор и вернет Курсор: -

public Cursor getAll() {
    return this.getWritableDatabase().query(TABLE_name,null,null,null,null,null,null);
}

Затем внесем несколько изменений в метод add в ADD Activity для вызова вышеуказанного метода и использования метода DatabaseUtils dumpCursor : -

public void add() {
    addy.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    boolean isInserted=myDB.insetDATA(date.getText().toString(),dept.getText().toString(),topic.getText().toString(),guests.getText().toString(),org.getText().toString(),speaker.getText().toString(),Integer.parseInt(students.getText().toString()));
                    if(isInserted) {
                        Toast.makeText(ADD.this, "Success", Toast.LENGTH_LONG).show();
                        Log.d("ADDRESULT", "Added row"); //<<<<<<<<<< Optional
                        Cursor csr = myDB.getAll();  //<<<<<<<<<< Get The Cursor
                        DatabaseUtils.dumpCursor(csr); //<<<<<<<<<< Dump the cursor (to the log)
                        csr.close(); //<<<<<<<<< Should always close a Cursor when done with it
                    } else {
                        Toast.makeText(ADD.this, "FAIL!!", Toast.LENGTH_LONG).show();
                    }
                }
    }
    );
}

Использование копии кода и после двух запусков приложения (добавлена ​​1 строкадля каждого прогона), то результат в журнале был: -

09-30 08:25:57.238 1933-1933/so52573525.so52573525 D/ADDRESULT: Added row
09-30 08:25:57.238 1933-1933/so52573525.so52573525 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@456d67
    0 {
       SEM_ID=1
       Date=2018-09-01
       Department=Area 1
       Topic=Blah
       Speaker=Fred
       No_of_Students=10
       Guests=Tom
       Organisation=The org
    }
    1 {
       SEM_ID=2
       Date=2018-08-01
       Department=Area 2
       Topic=Another
       Speaker=Mary
       No_of_Students=100
       Guests=Sue, Tom and Anne
       Organisation=Acme
    }
    <<<<<

получение БД из обозревателя устройств: -

enter image description here

  • Обратите внимание, что другая БД существует, поскольку я использовал существующий проект для ответа на вопрос.

Щелкните правой кнопкой мыши, чтобы сохранить: -

enter image description here

Откройте его в Tool (используется браузер БД для SQlite): -

enter image description here

Структура: -

enter image description here

  • Таблица android_metadata создается методами SQliteDatabase, она содержит строку для локали.
  • Таблица sqlite_sequence создается при использовании ключевых слов AUTOINCREMENT, в ней хранится наибольшее выделенное значение rowid

Данные в таблице семинаров: -

enter image description here

0 голосов
/ 30 сентября 2018

Могу ли я просто предложить вам использовать базу данных Room вместо SQLite.Я не знаю, является ли использование sql обязательным требованием, поэтому, возможно, это бесполезно, но после того, как однажды воспользовался Room, я не думаю, что кто-то должен возвращаться к дням SQLite.Он также заботится о важных проблемах безопасности и кэширования sql.

Его так легко настроить:

Seminar.java

@Entity
public class Seminar {
    @PrimaryKey
    private int uid;

    @ColumnInfo(name = "date")
    private String date;

    @ColumnInfo(name = "department")
    private String department;

    @ColumnInfo(name = "topic")
    private String topic;

... etc

    // Getters and setters are ignored for brevity,
    // but they're required for Room to work.
}

SeminarDao.java

@Dao
public interface SeminarDao {
    @Query("SELECT * FROM seminar")
    List<Seminar> getAll();

    @Insert
    void insert((Seminar seminar);

    @Insert
    void insertAll((Seminar... seminars);

    @Delete
    void delete(Seminar seminar);
}

SeminarDatabase.java

@Database(entities = {Seminar.class}, version = 1)
public abstract class SeminarDatabase extends RoomDatabase {
    public abstract SeminarDao seminarDao();

   private static volatile SeminarDatabase INSTANCE;

   static SeminarDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (SeminarDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            SeminarDatabase.class, "seminar")
                            .build();
                }
            }
        }
        return INSTANCE;
    }
}

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

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

 mSeminarDao = db.seminarDao();

 public void insert (Seminar seminar) {
   new insertAsyncTask(mSeminarDao).execute(seminar);
  }

   private static class insertAsyncTask extends AsyncTask<Seminar Void, Void> {

   private SeminarDao mAsyncTaskDao;

   insertAsyncTask(SeminarDao dao) {
       mAsyncTaskDao = dao;
   }

   @Override
   protected Void doInBackground(final Seminar... params) {
       mAsyncTaskDao.insert(params[0]);
       return null;
   }
  }

Просто добавьте это в build.gradle вашего приложения:

dependencies {
    def room_version = "1.1.1"

    implementation "android.arch.persistence.room:runtime:$room_version"
    annotationProcessor "android.arch.persistence.room:compiler:$room_version"
}

Все эти примеры я получил из документации Room .

...