2017-09-16 157 views
0

我试图让使用的AsyncTask将数据保存到一个SQLiteDatabase的AsyncTask:在执行doInBackground()时发生错误

布局简单应用:activity_main

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 
    android:layout_height="match_parent" 
    tools:context="jvtech.asynctask_practice.MainActivity"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/name" 
     android:hint="name" 
    /> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/college" 
     android:hint="college" 
    /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/save" 
     android:text="save" 
    /> 

</LinearLayout> 

主要类:MainActivity.java

package jvtech.asynctask_practice; 

import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class MainActivity extends AppCompatActivity 
{ 
EditText name,college; 
String n,c; 
Button save; 
Context ct; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    name=(EditText)findViewById(R.id.name); 
    college=(EditText)findViewById(R.id.college); 
    save=(Button)findViewById(R.id.save); 
    save.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      n=name.getText().toString(); 
      c=college.getText().toString(); 
      BackgroundTask backgroundTask=new BackgroundTask(ct); 
      backgroundTask.execute("add_item",n,c); 
      finish(); 
     } 
    }); 
}} 

TableData.java

package jvtech.asynctask_practice; 

import android.provider.BaseColumns; 

public final class TableData { 
public TableData(){} 
public static abstract class TableInfo implements BaseColumns{ 
    public static final String NAME="name"; 
    public static final String COLLEGE="college"; 
    public static final String TABLE_NAME="info_user"; 
    public static final String DATABASE_NAME="info_reg"; 
}} 

DatabaseOperation.java

package jvtech.asynctask_practice; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DatabaseOperations extends SQLiteOpenHelper { 

public static final int database_version=1; 
public String CREATE_QUERY="CREATE TABLE "+TableData.TableInfo.TABLE_NAME+"("+TableData.TableInfo.NAME+" TEXT,"+TableData.TableInfo.COLLEGE+" TEXT);"; 

public DatabaseOperations(Context context) { 
    super(context, TableData.TableInfo.DATABASE_NAME, null, database_version); 
    Log.d("Database Operations","Database created"); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_QUERY); 
    Log.d("Database opeartions","Table Created"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

public void putInformation(SQLiteDatabase sq,String name,String college) 
{ 
    ContentValues values=new ContentValues(); 
    values.put(TableData.TableInfo.NAME,name); 
    values.put(TableData.TableInfo.COLLEGE,college); 
    sq.insert(TableData.TableInfo.TABLE_NAME,null,values); 
    Log.d("Database Operations","One Row inserted"); 
}} 

BackgroundTask.java

package jvtech.asynctask_practice; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.os.AsyncTask; 
import android.widget.Toast; 

public class BackgroundTask extends AsyncTask<String,String,String> { 
Context ct; 
BackgroundTask(Context ct) 
{ 
    this.ct=ct; 
} 
@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(String... params) { 
    String method=params[0]; 
    DatabaseOperations db=new DatabaseOperations(ct); 
    if (method.equals("add_item")) 
    { 
     String n=params[1]; 
     String c=params[2]; 
     SQLiteDatabase sq=db.getWritableDatabase(); 
     db.putInformation(sq,n,c); 
    } 
    return "one row inserted"; 
} 

@Override 
protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
} 

@Override 
protected void onPostExecute(String s) { 
    Toast.makeText(ct,s, Toast.LENGTH_SHORT).show(); 
}} 

错误:

 [use following link to see errors][https://i.stack.imgur.com/7i6Qr.png] 

我重视和文件,我已经建立相关的项目。我希望程序从EditTexts中复制数据并使用AsyncTask将其存储在SQLiteDatabse中,但是出现错误。请帮忙。提前致谢。

+1

请将Java stack traces **作为文本**发布,而不是图像。 – CommonsWare

回答

0

您从不为ct赋值,所以当您创建BackgroundTask时,它的值为null

相关问题