【问题标题】:table not getting created in my databse(SQLite),Toast is showing success未在我的数据库(SQLite)中创建表,Toast 显示成功
【发布时间】:2018-09-30 20:58:49
【问题描述】:

我试图让这个应用程序通过 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();
                }
            }
    );
}
}

【问题讨论】:

  • 你怎么能说数据库没有被创建?你是什​​么意思我 Logcat 看起来也不错。?你能详细说明这两个短语吗
  • DB 已创建但它为空...我添加了一个查询以在其中创建一个表...但数据库仍然为空...logcat 也没有错误...我意味着其中似乎没有任何可疑之处...如果您愿意,我也可以添加...

标签: android android-sqlite


【解决方案1】:

我可以建议您使用 Room 数据库而不是 SQLite。我不知道是否需要使用 sql,所以也许这没用,但是在使用 Room 之后,我认为没有人应该回到 SQLite 时代。它还负责重要的 sql 安全和缓存问题。

设置非常简单:

研讨会.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);
}

研讨会数据库.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;
    }
}

然后您可以使用上面的单例模式获取实例。

您可以插入这样的值,使用 asynctask 作为 Room 确保您不能在 ui 线程中执行任何长时间运行的操作:

 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 docs here 获得了所有这些示例。

【讨论】:

    【解决方案2】:

    我相信您的问题在于您如何/使用什么来查看数据库。我已经复制了你的代码并运行它,它工作正常。

    我会建议一些小的补充,让您看看您的代码是否正常。

    首先在 DBAdapter 类中使用新方法,这会将所有行提取到 Cursor 中并返回 Cursor :-

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

    然后对ADD Activity中的add方法做一些改动,调用上述方法并使用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
        }
        <<<<<
    

    从设备资源管理器获取数据库:-

    • 请注意存在其他数据库,因为我使用现有项目回答问题。

    右键保存:-

    在工具中打开它(用于 SQlite 的数据库浏览器):-

    结构:-

    • 表 android_metadata 由 SQliteDatabase 方法创建,其中包含用于区域设置的一行。
    • 使用AUTOINCREMENT关键字时创建表sqlite_sequence,它存储最高分配的rowid

    研讨会表中的数据:-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多