java - Android 应用程序上的 SQLite 错误

标签 java android sqlite android-sqlite

我正在尝试构建一个可设置多个闹钟的应用程序,并且我想使用 SQLite 数据库保存闹钟。已经为此看了很多教程,但在使用数据库时仍然遇到问题。首先,我想通过按下按钮一个一个地保存警报。我也尝试手动插入 2 个警报,但也没有用。我究竟做错了什么?我对此很陌生!

DBHelper 类

public class DBHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "MyDBName.db";
public static final String ALARMS_TABLE_NAME = "alarms";
public static final String ALARMS_COLUMN_ID = "id";
public static final String ALARMS_COLUMN_HOUR = "hour";
public static final String ALARMS_COLUMN_MINUTES = "minutes";


public DBHelper(Context context) {
    super(context, DATABASE_NAME, null, 33);
}

public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

    db.execSQL("CREATE TABLE "+ALARMS_TABLE_NAME+" ("+ALARMS_COLUMN_ID+ " INTEGER PRIMARY KEY , "+
            ALARMS_COLUMN_HOUR+ " INTEGER, "+ALARMS_COLUMN_MINUTES+" INTEGER)");

    InsertAlarms(db);
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

    db.execSQL("DROP TABLE IF EXISTS "+ALARMS_TABLE_NAME);

    onCreate(db);
}

void AddAlarm(Alarm alarm)
{
    SQLiteDatabase db= this.getWritableDatabase();

    ContentValues cv=new ContentValues();

    cv.put(ALARMS_COLUMN_HOUR, alarm.getHour());
    cv.put(ALARMS_COLUMN_MINUTES, alarm.getMinutes());

    db.insert(ALARMS_TABLE_NAME, null, cv);
    db.close();
}

Cursor getAllAlarms()
{
    SQLiteDatabase db=this.getWritableDatabase();

    Cursor cur= db.rawQuery("SELECT * FROM "+ALARMS_TABLE_NAME,null);
    return cur;

}

void InsertAlarms(SQLiteDatabase db) //insert manually 2 alarms 
{
    ContentValues cv=new ContentValues();
    cv.put(ALARMS_COLUMN_ID, 1);
    cv.put(ALARMS_COLUMN_HOUR, 20);
    cv.put(ALARMS_COLUMN_MINUTES, 20);
    db.insert(ALARMS_TABLE_NAME, null, cv);

    cv.put(ALARMS_COLUMN_ID, 2);
    cv.put(ALARMS_COLUMN_HOUR, 20);
    cv.put(ALARMS_COLUMN_MINUTES, 20);
    db.insert(ALARMS_TABLE_NAME, null, cv);

}

int getAlarmCount()
{
    SQLiteDatabase db=this.getWritableDatabase();
    Cursor cur= db.rawQuery("Select * from "+ALARMS_TABLE_NAME, null);
    int x= cur.getCount();
    cur.close();
    return x;
}

类报警:

public class Alarm {
int _id;
int _hour;
int _minutes;

public Alarm(int Hour, int Minutes)
{
    this._hour=Hour;
    this._minutes=Minutes;
}

public int getID()
{
    return this._id;
}
public void SetID(int ID)
{
    this._id=ID;
}
public int getHour()
{
    return this._hour;
}
public int getMinutes()
{
    return this._minutes;
}

public void setHour(int Hour)
{
    this._hour=Hour;
}

public void setMinutes(int Minutes)
{
    this._minutes=Minutes;
}

Activity 添加警报

public class AddAlarm extends Activity {

EditText txtHour;
EditText txtMinutes;

DBHelper dbHelper;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_addalarm);

    txtHour=(EditText)findViewById(R.id.txtHour);
    txtMinutes=(EditText)findViewById(R.id.txtMinutes);

    Button button1 = (Button)findViewById(R.id.addalarmbtn);

    button1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v){
           btnAddAlarm_Click(v);
        }
    });

}

public void btnAddAlarm_Click(View view)
{
    boolean ok=true;
    try
    {

        int hour=Integer.parseInt(txtHour.getText().toString());
        int minutes=Integer.parseInt(txtMinutes.getText().toString());

        Alarm al=new Alarm(hour,minutes);
        Toast.makeText(AddAlarm.this,"ADDED! ", Toast.LENGTH_LONG).show();
        dbHelper.AddAlarm(al);


    }
    catch(Exception ex)
    {
        Toast.makeText(AddAlarm.this,"ERROR! ", Toast.LENGTH_LONG).show();
    }

}

主要 Activity :

public class MainActivity extends AppCompatActivity {

Intent intent=getIntent();
DBHelper mydb;
TextView xupnitiria;
String hour;
public  static boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button)findViewById(R.id.set_alarm_button);

    //Bundle extras=intent.getExtras();
    mydb=new DBHelper(this);

    xupnitiria =(TextView)findViewById(R.id.xupnitiria);

    xupnitiria.setText(xupnitiria.getText()+String.valueOf(mydb.getAlarmCount()));
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v){
            Intent a= new Intent(MainActivity.this, AddAlarm.class);
            startActivity(a);
        }
    });


}

android Monitor 上的错误

10-04 15:07:26.592 2625-2625/com.google.android.gms E/ActivityThread: Service com.google.android.gms.chimera.GmsIntentOperationService has leaked ServiceConnection csk@8709fba that was originally bound here
                                                                  android.app.ServiceConnectionLeaked: Service com.google.android.gms.chimera.GmsIntentOperationService has leaked ServiceConnection csk@8709fba that was originally bound here
                                                                      at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1336)
                                                                      at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1231)
                                                                      at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1450)
                                                                      at android.app.ContextImpl.bindService(ContextImpl.java:1422)
                                                                      at android.content.ContextWrapper.bindService(ContextWrapper.java:636)
                                                                      at android.content.ContextWrapper.bindService(ContextWrapper.java:636)
                                                                      at android.content.ContextWrapper.bindService(ContextWrapper.java:636)
                                                                      at android.content.ContextWrapper.bindService(ContextWrapper.java:636)
                                                                      at com.google.android.gms.chimera.container.zapp.ZappLogOperation.onHandleIntent(:com.google.android.gms:0)
                                                                      at com.google.android.chimera.IntentOperation.onHandleIntent(:com.google.android.gms:1)
                                                                      at bvq.run(:com.google.android.gms:9)
                                                                      at bvn.run(:com.google.android.gms:10)
                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                      at java.lang.Thread.run(Thread.java:761)

最佳答案

在 AddAlarm.java 的 onCreate() 中添加:

dbHelper=new DBHelper(this);

还要在 logcat 中查看错误日志,在 try-catch block 中添加以下内容:

ex.printStackTrace();

添加警报 Activity :

public class AddAlarm extends Activity {

    EditText txtHour;
    EditText txtMinutes;

    DBHelper dbHelper;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addalarm);

        txtHour = (EditText) findViewById(R.id.txtHour);
        txtMinutes = (EditText) findViewById(R.id.txtMinutes);

        dbHelper=new DBHelper(this);

        Button button1 = (Button) findViewById(R.id.addalarmbtn);

        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                btnAddAlarm_Click(v);
            }
        });

    }

    public void btnAddAlarm_Click(View view) {
        boolean ok = true;
        try {

            int hour = Integer.parseInt(txtHour.getText().toString());
            int minutes = Integer.parseInt(txtMinutes.getText().toString());

            Alarm al = new Alarm(hour, minutes);
            Toast.makeText(AddAlarm.this, "ADDED! ", Toast.LENGTH_LONG).show();
            dbHelper.AddAlarm(al);


        } catch (Exception ex) {
            Toast.makeText(AddAlarm.this, "ERROR! ", Toast.LENGTH_LONG).show();
            ex.printStackTrace();
        }

    }
}

关于java - Android 应用程序上的 SQLite 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568105/

相关文章:

spring boot 1.0升级到2.0时java测试编译错误:'bad signature ¾4s9'

java - 如何将 File.setReadable 映射到 NIO Path 操作

android - 使用 KeyStore 进行 RSA 解密时出现间歇性 IllegalBlockSizeException

java - 将 android studio 上的 SQLite 数据库与 Web 服务器上的 MySQL 数据库同步

sql - 如何显示相关(建议)关键字?

java - Android Java 将 long 强制转换为枚举问题

用于读取电子邮件和创建 JIRA 票证的 Java 守护进程?

java - 工具 :replace=android:value to &lt;meta-data> element at AndroidManisfest. xml:25:5-17:34 覆盖

Android -room 持久库 - DAO 调用是异步的,因此如何获取回调?

c# - NHibernate + SQLite,对象图加载时间过长