ANDROID:应用程序没有响应插入数据

时间:2017-01-19 07:28:23

标签: java android

我是Android编程的新手,我很难插入数据。当我提交表单时,app force会关闭,提示错误" App not Responding"

我创建了一个名为DB_Controller

的Java类
    package com.techdepot_ph.maco.secretjournal;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.Editable;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Created by Maco on 18-Jan-17.
 */
public class DB_Controller extends SQLiteOpenHelper {

    public DB_Controller(Context context) {
        super(context, "app.db", null, 1);
    }

    //This creates the database
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE STORIES( " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "uniq_id TEXT, " +
                "title TEXT, " +
                "body TEXT, " +
                "is_private INT, '" +
                "dev_id TEXT, " +
                "user_id TEXT, " +
                "date_time TEXT)");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS STORIES");
        onCreate(db);
    }

    //This inserts the Data in the Database
    public void insert_story(String story_title, String story_body) {
        ContentValues content = new ContentValues();
        content.put("title", story_title);
        content.put("body", story_body);      

        this.getWritableDatabase().insertOrThrow("STORIES", "", content);


    }

在我的Activity类

package com.techdepot_ph.maco.secretjournal;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.Toast;

public class StoryCreate_Activity extends AppCompatActivity {

    DB_Controller db;
    EditText story_title, story_body;
    //Switch is_private;

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


        story_title = (EditText) findViewById(R.id.story_title);
        story_body = (EditText) findViewById(R.id.story_body);
        //is_private = (Switch) findViewById(R.id.story_private);


    }

    public  void btn_click(View view) {
        db = new DB_Controller(this);
        switch(view.getId()) {
            case R.id.story_submit:
                    db.insert_story(story_title.getText().toString(), story_body.getText().toString());
                    Toast.makeText(StoryCreate_Activity.this, "Data Saved!", Toast.LENGTH_LONG).show();
                    break;


        }
    }
}

在我的布局中,我定义了按钮R.id.story_submit来调用btn_click() onClick。

4 个答案:

答案 0 :(得分:3)

这是创建表查询中的问题。

<强>此前:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE STORIES( " +
            "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "uniq_id TEXT, " +
            "title TEXT, " +
            "body TEXT, " +
            "is_private INT, '" +
            "dev_id TEXT, " +
            "user_id TEXT, " +
            "date_time TEXT)");
}

更新至:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE STORIES( " +
            "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "uniq_id TEXT, " +
            "title TEXT, " +
            "body TEXT, " +
            "is_private INTEGER, " +
            "dev_id TEXT, " +
            "user_id TEXT, " +
            "date_time TEXT)");
}

答案 1 :(得分:1)

更新:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE STORIES( " +
            "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "uniq_id TEXT, " +
            "title TEXT, " +
            "body TEXT, " +
            "is_private INTEGER, " +
            "dev_id TEXT, " +
            "user_id TEXT, " +
            "date_time TEXT)");
}

答案 2 :(得分:0)

我认为你应该在后台线程上调用插入数据到数据库,而不是直接在主线程上调用。你可以使用Thread,AsyncStack来做到这一点。

答案 3 :(得分:0)

您的应用程序代码可能存在许多不同的问题,您需要在底部提交生成的错误日志以了解ANR(应用程序无响应)错误的原因如果应用程序在5秒内没有响应,请关闭它。

查看您的代码,您只有2个字段需要插入数据库story_title,story_body,其余字段是冗余的,除了_id是一个自动递增的密钥。

通过浏览你的应用程序我可以找到一些东西:

  • 错误的数据类型使用整数代替 Int for SQLite
  • 错误 语义 is_private INTEGER 当我们使用is_时,我们引用 BOOLEAN 真/假
  • 将其缩小,删除不使用的代码,只需坚持使用2个字段

因此,即使在修复此问题时,您仍可能遇到错误,如果没有日志我们无法进一步指出,我创建了一个类似的应用程序,可以帮助您了解如何在Android中处理数据库{{3 }}

此应用程序不运行后台任务,最好是在不同的线程上处理数据库,但为了详细说明,这肯定会有所帮助。