我之前使用dbhelper创建了一个数据库,现在我想使用此代码添加一个表。但我收到错误,没有找到这样的表格。请你能帮助我。
我是否每次都需要打开数据库,并且可以使用单个dbHelper
类为两个不同的活动创建两个表。
package com.example.kunj.scope;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static android.database.sqlite.SQLiteDatabase.openDatabase;
import static com.example.kunj.scope.ScopeDBHelper.CREATE_TABLE;
import static com.example.kunj.scope.ScopeDBHelper.DATABASE_NAME;
import static com.example.kunj.scope.ScopeDBHelper.DATABASE_VERSION;
/**
* Created by kunj on 2/8/2018.
*/
public class CustomScopeDBHelper {
public Context context;
SQLiteDatabase db;
ScopeOpenHelper scopeOpenHelper;
String DBPATH;
public CustomScopeDBHelper(Context context) {
this.context = context;
scopeOpenHelper = new ScopeOpenHelper(context);
// this.DBPATH = this.context.getDatabasePath(DATABASE_NAME).getAbsolutePath();
// Log.e("Path 1", DBPATH);
db = scopeOpenHelper.getWritableDatabase();
}
public static String query;
public static final String DATABASE_NAME = "scope.db";
public static final int DATABASE_VERSION = 1;
String TABLE_NAME;
public void getQuery(List<String> columnName, String tableName) {
TABLE_NAME = tableName;
/*int i = columnName.size();
int count = 0;
StringBuilder sb = new StringBuilder();
for (String str : columnName) {
count++;
if (sb.length() == 0) {
sb.append("create table " + TABLE_NAME + " ( ID text, ");
}
if (count != (i)) {
sb.append(str + " " + "text,");
} else {
sb.append(str + " " + "text);");
}
}
query = (sb.toString()); */
query = "create table "+ TABLE_NAME +" ( col1 text, col2 text, col3 text, col4, text);";
// CREATE_TABLE= "create table "+tableName+" ( "+"id"+ " text, "+"col1"+" text , "+"col2"+" text, " +"col3"+" text , "+"col4"+" text );";
}
void addEntry(List<String> data,GenericDTO genericDTO)
{
List<Object> cols = genericDTO.getAttributeValues("custom_expense");
// System.out.println("Cols:"+cols.size());
// System.out.println("Data"+data.size());
//List<String> columnName = new ArrayList<>();
int size = data.size();
ContentValues values = new ContentValues();
for(int i =0; i<size;i++) {
//Toast.makeText(context, cols.get(i).toString(), Toast.LENGTH_SHORT).show();
values.put(cols.get(i).toString(), data.get(i));
/* values.put("col1","a");
values.put("col2","a");
values.put("col3","a");
values.put("col4","a");*/
}
long res = db.insert(TABLE_NAME, null, values);
//long res = db.insert(TABLE_NAME,null,values);
if (res == -1) {
Toast.makeText(context, "Failed", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Success", Toast.LENGTH_SHORT).show();
}
}
private class ScopeOpenHelper extends SQLiteOpenHelper {
String DBPATH;
Context ctx;
public ScopeOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
package com.example.kunj.scope;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by kunj on 1/23/2018.
*/
public class CustomizeFragment extends Fragment {
Dialog dialog;
Button addbtn;
EditText data1,data2,data3,data4;
ListView customlistview;
CustomScopeDBHelper customScopeDBHelper;
GenericDTO genericDTO;
ScopeDBHelper scopeDBHelper;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.custom_frg,container,false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
customlistview = (ListView) view.findViewById(R.id.customlistview);
customScopeDBHelper = new CustomScopeDBHelper(getActivity());
addbtn = (Button) view.findViewById(R.id.addbtn);
scopeDBHelper = new ScopeDBHelper(getActivity());
data1 = (EditText) view.findViewById(R.id.data1);
data2 = (EditText) view.findViewById(R.id.data2);
data3 = (EditText) view.findViewById(R.id.data3);
data4 = (EditText) view.findViewById(R.id.data4);
genericDTO = new GenericDTO();
addbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String dataOne = data1.getText().toString();
final String dataTwo = data2.getText().toString();
final String dataThree = data3.getText().toString();
final String dataFour = data4.getText().toString();
List<String> data = new ArrayList<String>();
data.add(dataOne);
data.add(dataTwo);
data.add(dataThree);
data.add(dataFour);
List<String> columnList = new ArrayList<String>();
columnList.add("col1");
columnList.add("col2");
columnList.add("col3");
columnList.add("col4");
String TABLE_NAME = "custom_expense";
customScopeDBHelper.getQuery(columnList, TABLE_NAME);
for(String s:columnList)
genericDTO.addAttribute(TABLE_NAME,s);
customScopeDBHelper.addEntry(data,genericDTO);
}
});
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog = new Dialog(getActivity());
dialog.setTitle("Create Record");
dialog.setContentView(R.layout.layout_dialog);
Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
dialog.show();
}
});
}
制作主数据库的主DBHelper类运行正常:
package com.example.kunj.scope;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by kunj on 10/8/2017.
*/
public class ScopeDBHelper {
public static final String DATABASE_NAME = "scope.db";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_EXPENSE = "expense_table";
// public static final String TABLE_ATTENDANCE = "attendance_table";
public static final String COLUMN_ID= "ID";
public static final String COLUMN_CATEGORY= "CATEGORY";
public static final String COLUMN_DESCRIPTION= "DESCRIPTION";
public static final String COLUMN_AMOUNT= "AMOUNT";
public static final String COLUMN_DATE= "DATE";
public final String CREATE_TABLE= "create table "+TABLE_EXPENSE+" ( "+COLUMN_ID+ " text, "+COLUMN_CATEGORY+" text , "+COLUMN_DESCRIPTION+" text, " +COLUMN_AMOUNT+" text , "+COLUMN_DATE+" date );";
public Context context;
ScopeOpenHelper scopeOpenHelper;
public static SQLiteDatabase db;
public ScopeDBHelper(Context context) {
this.context = context;
scopeOpenHelper = new ScopeOpenHelper(context);
db = scopeOpenHelper.getWritableDatabase();
}
void addExpense(Expense expense){
ContentValues values = new ContentValues();
values.put(COLUMN_CATEGORY, expense.getCategory());
values.put(COLUMN_DESCRIPTION, expense.getDescription());
values.put(COLUMN_AMOUNT,expense.getAmount());
values.put(COLUMN_DATE, expense.getDate());
long res = db.insert(TABLE_EXPENSE,null,values);
/*if(res == -1)
{
Toast.makeText(context,"Failed",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(context,"Success",Toast.LENGTH_SHORT).show();
}*/
}
List<Expense> getallExpenses()
{
List<Expense> expenses = new ArrayList<>();
Cursor cursor = db.query(TABLE_EXPENSE,null,null,null,null,null,null);
if(cursor != null && cursor.moveToFirst())
{
do {
String category = cursor.getString(cursor.getColumnIndex(COLUMN_CATEGORY));
String description = cursor.getString(cursor.getColumnIndex(COLUMN_DESCRIPTION));
String amount = cursor.getString(cursor.getColumnIndex(COLUMN_AMOUNT));
String date = cursor.getString(cursor.getColumnIndex(COLUMN_DATE));
expenses.add(new Expense(category,description,amount,date) );
}while (cursor.moveToNext());
}
return expenses;
}
public int deleteExpense(Expense ex) {
return db.delete(TABLE_EXPENSE,COLUMN_DESCRIPTION+"=?",new String[]{ex.description});
}
private class ScopeOpenHelper extends SQLiteOpenHelper {
public ScopeOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
//System.out.print(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
}
使用数据库的片段是:
package com.example.kunj.scope;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
/**
* Created by kunj on 1/23/2018.
*/
public class ExpenseFragment extends Fragment implements AdapterView.OnItemLongClickListener {
Dialog dialog;
Spinner categorySpinner;
ArrayAdapter<String> categoryAdapter;
EditText descriptionEt,amountEt,dateEt;
Button addbtn,clearbtn,intentbtn;
ScopeDBHelper scopeDBHelper;
List<Expense> expenses;
ListView expenselistview;
ExpenseAdapter expenseAdapter;
Calendar myCalendar;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.expense_frg,container,false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
expenselistview = (ListView)view.findViewById(R.id.expenselistview);
scopeDBHelper = new ScopeDBHelper(getActivity());
expenses = scopeDBHelper.getallExpenses();
expenseAdapter = new ExpenseAdapter((HomePage) getActivity(),expenses);
expenselistview.setAdapter(expenseAdapter);
expenselistview.setOnItemLongClickListener(this);
myCalendar = Calendar.getInstance();
final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog = new Dialog(getActivity());
dialog.setTitle("Add Expense");
dialog.setContentView(R.layout.layout_dialog);
Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
dialog.show();
categorySpinner = (Spinner) dialog.findViewById(R.id.category);
descriptionEt= (EditText) dialog.findViewById(R.id.description);
amountEt = (EditText) dialog.findViewById(R.id.amount);
dateEt = (EditText) dialog.findViewById(R.id.date);
addbtn = (Button) dialog.findViewById(R.id.addbtn);
clearbtn = (Button) dialog.findViewById(R.id.clearbtn);
String items [] ={"Entertainment","Food","Movie","Goods","Fuel","Other"};
categoryAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item,items);
categorySpinner.setAdapter(categoryAdapter);
dateEt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(HomePage.this,"Clicked",Toast.LENGTH_SHORT).show();
// TODO Auto-generated method stub
new DatePickerDialog(getActivity(), date, myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
addbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String categorystrng = categorySpinner.getSelectedItem().toString();
final String descriptionstrng = descriptionEt.getText().toString();
final String amountstrng = amountEt.getText().toString();
final String datestrng = dateEt.getText().toString();
/*if(categorystrng.isEmpty())
{
categoryEt.setError("Mandatory field");
return;
}*/
if(descriptionstrng.isEmpty())
{
descriptionEt.setError("Mandatory field");
return;
}
if(amountstrng.isEmpty())
{
amountEt.setError("Mandatory field");return;
}
Expense expense = new Expense(categorystrng,descriptionstrng,amountstrng,datestrng);
//Toast.makeText(HomePage.this, categorystrng,Toast.LENGTH_SHORT).show();
scopeDBHelper.addExpense(expense);
expenseAdapter.addExpense(expense);
expenseAdapter.notifyDataSetChanged();
dialog.dismiss();
}
});
}
});
}
private void updateLabel() {
String myFormat = "dd/MM/yy"; //In which you need put here
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
dateEt.setText(sdf.format(myCalendar.getTime()));
}
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
final Expense ex = expenses.get(i);
final AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());
dialog.setTitle("Delete Expense");
dialog.setMessage("Do you want to delete this entry?");
dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if(scopeDBHelper.deleteExpense(ex)==1)
{
Toast.makeText(getContext(),"Expense Deleted",Toast.LENGTH_SHORT).show();
expenseAdapter.delete(ex);
expenseAdapter.notifyDataSetChanged();
}
else
{
Toast.makeText(getContext(),"Couldn't delete this entry",Toast.LENGTH_SHORT).show();
}
}
});
dialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
return false;
}
}