2014-03-02 41 views
0

我的数据库类是DB.java如何从非数据库类打开数据库?

package com.example.pocketbooker; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.BaseColumns; 

public class DB extends SQLiteOpenHelper implements BaseColumns{ 

    private static final String DATABASE_NAME = "pb_database.db"; 
    private static final int DATABASE_VERSION = 1; 


    public DB(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE Members(_id INTEGER PRIMARY KEY AUTOINCREMENT, Mem_Name VARCHAR(50));"); 
     db.execSQL("CREATE TABLE Incomes(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     "Inc_Name VARCHAR(50), Inc_Sum VARCHAR(10), Inc_Mem VARCHAR (50), Inc_Change_Date DATE, " + 
       "Inc_Perbeg_Date DATE, Inc_Period VARCHAR (4));"); 
     db.execSQL("CREATE TABLE Outcomes(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "Out_Name VARCHAR(50), Out_Sum VARCHAR(10), Out_Mem VARCHAR (50), Out_Change_Date DATE, " + 
         "Out_Perbeg_Date DATE, Out_Period VARCHAR (4));"); 
     db.execSQL("CREATE TABLE Goals(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "Goal_Name VARCHAR(50), Goal_Sum VARCHAR(10), Goal_Mem VARCHAR (50), Goal_Change_Date DATE, " + 
         "Goal_Perbeg_Date DATE, Goal_Period VARCHAR (4));"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { 
     // TODO Auto-generated method stub 

    } 

} 

我的 “其他” 类Dialog_mem.java

package com.example.pocketbooker; 

import android.annotation.SuppressLint; 
import android.app.DialogFragment; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.Toast; 

@SuppressLint({ "NewApi", "ValidFragment" }) 
public class Dialog_mem extends DialogFragment implements OnClickListener { 
    EditText memname; 

    ContentValues cv = new ContentValues(); 
    private SQLiteDatabase database; 
    private DB dbHelper; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    getDialog().setTitle("Добавить Члена Семьи"); 

    View v = inflater.inflate(R.layout.mem_dialog, null); 

    v.findViewById(R.id.mem_btnOK).setOnClickListener(this); 
    v.findViewById(R.id.mem_btnCancel).setOnClickListener(this); 
    memname=(EditText) v.findViewById(R.id.mem_name); 

    return v; 

    } 


public void onClick(View v) { 

     switch(v.getId()) 
     { case R.id.mem_btnOK: 
      database = dbHelper.getWritableDatabase(); 
      cv.put("Mem_Name", memname.getText().toString()); 
      database.insert("Members", "Mem_Name", cv); 
      database.close(); 

      Toast.makeText(getActivity(), "Добавлено", Toast.LENGTH_SHORT).show(); 
     default: 
      dismiss();} 

    } 

    public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 

    } 

    public void onCancel(DialogInterface dialog) { 
    super.onCancel(dialog); 

    } 

} 

的Eclipse显示NullPointerException。我想这是上下文错误,但我不知道如何指出所需的上下文。 getActivity()是错误的。 “这个也是。 getApplicationContext()根本不起作用。

+0

哪一行是抛出NullPointerException?你永远不应该在Fragment类中打开数据库。相反,将您的数据库处理方法移出到一个新的DatabaseUtils类或类似的名称。这样,您所有的数据库访问都将在一个类中进行,这将使测试变得更加容易,并将数据库从界面代码中分离出来。 – SDJMcHattie

+0

阅读并使用ContentProvider – pskink

回答

3

您需要初始化dbHelper实例。 你可以做的是
1.为所有数据库操作创建一个单例类。
2.创建一个数据源类。通过它你将访问数据库。
3.在数据源类中添加open()方法

/** 
* Open the Database 
* @throws SQLException 
*/ 
public void open() throws SQLException { 
    if (dbHelper != null) { 
     db = dbHelper.getWritableDatabase(); 
    } 
} 
/** 
* Close 
*/ 
public void close() { 
    dbHelper.close(); 
} 


4.写,你需要存取权限的DataSource类数据库和调用数据库操作这个数据库实例的方法。

1

那么,我用akashsr的答案(谢谢你,男人,这个想法)。如果任何人有兴趣,我是如何做到的(最后)是代码。

DB.java

package com.example.pocketbooker; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.BaseColumns; 

public class DB extends SQLiteOpenHelper implements BaseColumns{ 

    private static final String DATABASE_NAME = "pb_database.db"; 
    private static final int DATABASE_VERSION = 1; 
    private static DB sInstance; 
    ContentValues cv; 
    public DB(Context context) { 

     super(context, DATABASE_NAME, null, DATABASE_VERSION);} 



    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE Members(_id INTEGER PRIMARY KEY AUTOINCREMENT, Mem_Name VARCHAR(50));"); 
     db.execSQL("CREATE TABLE Incomes(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     "Inc_Name VARCHAR(50), Inc_Sum VARCHAR(10), Inc_Mem VARCHAR (50), Inc_Change_Date DATE, " + 
       "Inc_Perbeg_Date DATE, Inc_Period VARCHAR (4));"); 
     db.execSQL("CREATE TABLE Outcomes(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "Out_Name VARCHAR(50), Out_Sum VARCHAR(10), Out_Mem VARCHAR (50), Out_Change_Date DATE, " + 
         "Out_Perbeg_Date DATE, Out_Period VARCHAR (4));"); 
     db.execSQL("CREATE TABLE Goals(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "Goal_Name VARCHAR(50), Goal_Sum VARCHAR(10), Goal_Mem VARCHAR (50), Goal_Change_Date DATE, " + 
         "Goal_Perbeg_Date DATE, Goal_Period VARCHAR (4));"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { 
     // TODO Auto-generated method stub 

    } 

} 

创建DataSource类与插入方法。 PBDataSource.java

package com.example.pocketbooker; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class PBDataSource { 

    DB dbHelper; 
    SQLiteDatabase db; 
    public PBDataSource(Context context) { 
      dbHelper = new DB(context); 
      } 
    public void open() throws SQLException { 
     if (dbHelper != null) { 
      db = dbHelper.getWritableDatabase(); 
     } 
    } 

    public void close() { 
     dbHelper.close(); 
    } 

    public void insertrecord (String a, String b, String c) 
    {ContentValues cv= new ContentValues(); 
     cv.put(b,c); 
     db.insert(a, null, cv); 
    } 
} 

在我DialogFragment类使用这种方法Dialog_mem.java

package com.example.pocketbooker; 

import android.annotation.SuppressLint; 
import android.app.DialogFragment; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.Toast; 

@SuppressLint({ "NewApi", "ValidFragment" }) 
public class Dialog_mem extends DialogFragment implements OnClickListener { 
    EditText memname; 
    private PBDataSource datasource; 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    getDialog().setTitle("Добавить Члена Семьи"); 

    View v = inflater.inflate(R.layout.mem_dialog, null); 

    v.findViewById(R.id.mem_btnOK).setOnClickListener(this); 
    v.findViewById(R.id.mem_btnCancel).setOnClickListener(this); 
    memname=(EditText) v.findViewById(R.id.mem_name); 

    datasource = new PBDataSource(getActivity()); 
    return v; 

    } 


public void onClick(View v) { 

     switch(v.getId()) 
     { case R.id.mem_btnOK: 

      datasource.open(); 
      datasource.insertrecord("Members","Mem_Name", memname.getText().toString()); 
      datasource.close(); 
      Toast.makeText(getActivity(), "Добавлено", Toast.LENGTH_SHORT).show(); 
     default: 
      dismiss();} 

    } 

    public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 

    } 

    public void onCancel(DialogInterface dialog) { 
    super.onCancel(dialog); 

    }} 

当然,我是一个菜鸟。我尽可能地学习自己。我希望它能帮助像我这样的人。