我目前正在尝试在eclipse上创建数据库。用户可以输入他/她的名字并将其保存在数据库中。除此之外,保存数据将显示在下一页中。
我已经尝试过你们之前告诉我的内容并发现了类似的错误。
以下是更新的代码:
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter your name below:"
/>
<EditText
android:id="@+id/nameText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter your langtitude below:"
/>
<EditText
android:id="@+id/langText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter your longtitude below:"
/>
<EditText
android:id="@+id/longText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/saveButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save"
/>
solution.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/list">
</ListView>
DataAdapter.java
package com.mp.Testing;
import java.io.IOException;
import com.mp.Testing.DataAdapter;
import com.mp.Testing.DataListActivity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;
public class DataAdapter
{
// Name of the database
private static final String DATABASE_NAME = "information";
// Names of the Tables in Database
public static final String DATABASE_TABLE_1 = "pictures";
public static final String DATABASE_TABLE_2 = "data";
// Version of the database
private static final int DATABASE_VERSION = 1;
// Columns present in DATABASE_TABLE
public static final String PICTURES_ROWID = "_id";
public static final String PICTURES_FILE = "pictures_file";
public static final String DATA_NAME = "_name";
public static final String DATA_LANGTITUDE = "pictures_langtitude";
public static final String DATA_LONGTITUDE = "pictures_longtitude";
// Help to create & manage the SQLiteDatabase
private DataDBHelper DbHelper;
// CRUD on SQLiteDatabase
private SQLiteDatabase database;
// SQL query string for creating DATABASE_TABLE_1
static final String CREATE_DATABASE_TABLE_1 =
"create table " + DATABASE_TABLE_1 + " (" + PICTURES_ROWID +
" integer primary key autoincrement, " + PICTURES_FILE +
" text not null);";
// SQL query string for creating DATABASE_TABLE_2
static final String CREATE_DATABASE_TABLE_2 =
"create table " + DATABASE_TABLE_2 + " (" + DATA_NAME +
" integer primary key autoincrement, " + DATA_LANGTITUDE +
" text not null, " + DATA_LONGTITUDE + " text not null);";
// Context object associated with the SQLite database object
private final Context Ctx;
// Constructor
public DataAdapter(Context ctx)
{
this.Ctx = ctx;
}
// Open database connection
public DataAdapter open() throws android.database.SQLException
{
DbHelper = new DataDBHelper(Ctx);
database = DbHelper.getWritableDatabase();
return this;
}
// Close database connection
public void close()
{
DbHelper.close();
}
// Create the database_1 & define the values that is being insert
public long createPictures(String file)
{
ContentValues initialValues = new ContentValues();
initialValues.put(PICTURES_FILE, file);
return database.insert(DATABASE_TABLE_1, null, initialValues);
}
// Create the database_2 & define the values that is being insert
public long createData(String lan, String lon)
{
ContentValues initialValues = new ContentValues();
initialValues.put(DATA_LANGTITUDE, lan);
initialValues.put(DATA_LONGTITUDE, lon);
return database.insert(DATABASE_TABLE_2, null, initialValues);
}
// Delete the ID in the database_1
public boolean deletePictures(long picsId)
{
return database.delete(DATABASE_TABLE_1, PICTURES_ROWID + "=" + picsId, null) > 0;
}
// Delete the ID in the database_2
public boolean deleteData(long dataId)
{
return database.delete(DATABASE_TABLE_2, DATA_NAME + "=" + dataId, null) > 0;
}
// Find all the data of database_1 from the system
public Cursor fetchAllPictures()
{
return database.query(DATABASE_TABLE_1, new String[] {PICTURES_ROWID, PICTURES_FILE}, null, null, null, null, null);
}
// Find all the data of database_2 from the system
public Cursor fetchAllData()
{
return database.query(DATABASE_TABLE_2, new String[] {DATA_NAME, DATA_LANGTITUDE, DATA_LONGTITUDE}, null, null, null, null, null);
}
// Fetch Pictures according to ID
public Cursor fetchPictures(long picsId) throws SQLException
{
Cursor dCursor =
database.query(true, DATABASE_TABLE_1, new String[] {PICTURES_ROWID,
PICTURES_FILE}, PICTURES_ROWID + "=" +
picsId, null, null, null, null, null);
// Go to the first record
if (dCursor != null)
{
dCursor.moveToFirst();
}
return dCursor;
}
// Fetch Data according to ID
public Cursor fetchData(long dataId) throws SQLException
{
Cursor dCursor =
database.query(true, DATABASE_TABLE_2, new String[] {DATA_NAME,
DATA_LANGTITUDE, DATA_LONGTITUDE}, DATA_NAME + "=" +
dataId, null, null, null, null, null);
// Go to the first record
if (dCursor != null)
{
dCursor.moveToFirst();
}
return dCursor;
}
// Update the database_1
public boolean updatePictures(long picsId, String file)
{
ContentValues args = new ContentValues();
args.put(PICTURES_FILE, file);
return database.update(DATABASE_TABLE_1, args, PICTURES_ROWID + "=" + picsId, null) > 0;
}
// Update the database_2
public boolean updateData(long dataId, String lan, String lon)
{
ContentValues args = new ContentValues();
args.put(DATA_LANGTITUDE, lan);
args.put(DATA_LONGTITUDE, lon);
return database.update(DATABASE_TABLE_2, args, DATA_NAME + "=" + dataId, null) > 0;
}
}
DataListActivity.java
package com.mp.Testing;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.app.ListActivity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class DataListActivity extends ListActivity
{
private static final int ACTIVITY_CREATE=0;
private static final int ACTIVITY_EDIT=1;
// Define the variables
private DataAdapter DbHelper;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DbHelper = new DataAdapter(this);
DbHelper.open();
fillData();
registerForContextMenu(getListView());
}
// Fill the data in the database
private void fillPictures()
{
Cursor dbCursor = DbHelper.fetchAllData();
startManagingCursor(dbCursor);
// Creating an array to specify the fields we want
String[] dat = new String[]{DataAdapter.PICTURES_FILE};
// An array of the fields we want to bind in the view
int[] dato = new int[]{R.id.nameText};
// Create a simple cursor adapter & display it
SimpleCursorAdapter reminders = new SimpleCursorAdapter(this, R.layout.solution, dbCursor, dat, dato);
setListAdapter(reminders);
}
// Fill the data in the database
private void fillData()
{
Cursor dbCursor = DbHelper.fetchAllData();
startManagingCursor(dbCursor);
// Creating an array to specify the fields we want
String[] lan = new String[]{DataAdapter.DATA_LANGTITUDE};
String[] lon = new String[]{DataAdapter.DATA_LONGTITUDE};
// An array of the fields we want to bind in the view
int[] lanto = new int[]{R.id.langText};
int[] lonto = new int[]{R.id.longText};
// Create a simple cursor adapter & display it
SimpleCursorAdapter landers = new SimpleCursorAdapter(this, R.layout.solution, dbCursor, lan, lanto);
setListAdapter(landers);
// Create a simple cursor adapter & display it
SimpleCursorAdapter londers = new SimpleCursorAdapter(this, R.layout.solution, dbCursor, lon, lonto);
setListAdapter(londers);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, DataEditActivity.class);
i.putExtra(DataAdapter.PICTURES_ROWID, id);
i.putExtra(DataAdapter.DATA_NAME, id);
startActivityForResult(i, ACTIVITY_EDIT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
super.onActivityResult(requestCode, resultCode, intent);
fillData();
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.list:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
DbHelper.deleteData(info.id);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
}
DataEditActivity.java
package com.mp.Testing;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class DataEditActivity extends Activity implements OnClickListener
{
private DataAdapter DbHelper;
private Long mPicsId;
private Long mDataId;
private EditText ET;
private EditText LAT;
private EditText LOT;
private Button SB;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DbHelper = new DataAdapter(this);
ET = (EditText) findViewById(R.id.nameText);
LAT = (EditText) findViewById(R.id.langText);
LOT = (EditText) findViewById(R.id.longText);
SB = (Button) findViewById(R.id.saveButton);
mPicsId = savedInstanceState != null
? savedInstanceState.getLong(DataAdapter.PICTURES_ROWID): null;
mDataId = savedInstanceState != null
? savedInstanceState.getLong(DataAdapter.DATA_NAME): null;
registerButtonListenersAndSetDefaultText();
}
private void registerButtonListenersAndSetDefaultText()
{
// TODO Auto-generated method stub
SB.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
saveState();
setResult(RESULT_OK);
Toast.makeText(DataEditActivity.this,
getString(R.string.message),
Toast.LENGTH_SHORT).show();
finish();
}
});
}
// Intent to start the activity
private void setRowIdFromIntent()
{
if (mPicsId == null)
{
Bundle extras = getIntent().getExtras();
mPicsId = extras != null
? extras.getLong(DataAdapter.PICTURES_ROWID): null;
}
if (mDataId == null)
{
Bundle extras = getIntent().getExtras();
mDataId = extras != null
? extras.getLong(DataAdapter.DATA_NAME): null;
}
}
// Database is close when it is pause
@Override
protected void onPause()
{
super.onPause();
DbHelper.close();
}
// Resume the database
@Override
protected void onResume()
{
super.onResume();
DbHelper.open();
setRowIdFromIntent();
populateFields();
}
// Populate the form
private void populateFields()
{
if (mPicsId != null)
{
Cursor pics = DbHelper.fetchData(mPicsId);
startManagingCursor(pics);
ET.setText(pics.getString(
pics.getColumnIndexOrThrow(DataAdapter.PICTURES_FILE)));
}
if (mDataId != null)
{
Cursor data = DbHelper.fetchData(mDataId);
startManagingCursor(data);
LAT.setText(data.getString(
data.getColumnIndexOrThrow(DataAdapter.DATA_LANGTITUDE)));
LOT.setText(data.getString(
data.getColumnIndexOrThrow(DataAdapter.DATA_LONGTITUDE)));
}
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putLong(DataAdapter.PICTURES_ROWID, mPicsId);
outState.putLong(DataAdapter.DATA_NAME, mDataId);
}
private void saveState()
{
String file = ET.getText().toString();
String lan = LAT.getText().toString();
String lon = LOT.getText().toString();
if (mPicsId == null && mDataId == null)
{
long id = DbHelper.createPictures(file);
long ild = DbHelper.createData(lan, lon);
if (id > 0 && ild > 0)
{
mPicsId = id;
mDataId = ild;
}
}
else
{
DbHelper.updatePictures(mPicsId, file);
DbHelper.updateData(mDataId, lan, lon);
}
}
@Override
public void onClick(View v)
{
Intent i = new Intent(DataEditActivity.this, DataEditActivity.class);
startActivity(i);
}
}
DataDBHelper.java
package com.mp.Testing;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataDBHelper extends SQLiteOpenHelper
{
// Name & the version of Database.
public static final String DATABASE_NAME = "information";
public static final int DATABASE_VERSION = 1;
// Names of the Tables in Database
public static final String DATABASE_TABLE_1 = "pictures";
public static final String DATABASE_TABLE_2 = "data";
// Columns present in DATABASE_TABLE
public static final String PICTURES_ROWID = "_id";
public static final String PICTURES_FILE = "pictures_file";
public static final String DATA_NAME = "_name";
public static final String DATA_LANGTITUDE = "pictures_langtitude";
public static final String DATA_LONGTITUDE = "pictures_longtitude";
// SQL query string for creating DATABASE_TABLE_1
static final String CREATE_DATABASE_TABLE_1 =
"create table " + DATABASE_TABLE_1 + " (" + PICTURES_ROWID +
" integer primary key autoincrement, " + PICTURES_FILE +
" text not null);";
// SQL query string for creating DATABASE_TABLE_2
static final String CREATE_DATABASE_TABLE_2 =
"create table " + DATABASE_TABLE_2 + " (" + DATA_NAME +
" integer primary key autoincrement, " + DATA_LANGTITUDE +
" text not null, " + DATA_LONGTITUDE + " text not null);";
// To execute the SQL command
@Override
public void onCreate(SQLiteDatabase database)
{
database.execSQL(CREATE_DATABASE_TABLE_1);
database.execSQL(CREATE_DATABASE_TABLE_2);
Log.d("SaveData", "Created DB");
}
public static final String TAG_1 = "PICTURES_TABLE";
public static final String TAG_2 = "DATA_TABLE";
private Context context;
// Constructor
public DataDBHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
}
// Upgrading the database version
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO Auto-generated method stub
}
// Inserting pictures into database
private void insertDataIntoPictures(SQLiteDatabase db)
{
try
{
InputStream is = context.getResources().openRawResource(R.raw.picture);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String strLine = null;
while ((strLine = (br.readLine()).trim()) != null)
{
String[] temp = null;
ContentValues initialValues = new ContentValues();
initialValues.put(PICTURES_FILE, temp[0].trim());
db.insert(DATABASE_TABLE_1, null, initialValues);
}
is.close();
}
catch (Exception e)
{
Log.d(TAG_1, "Error while inserting common names into table");
}
}
// Inserting data into database
private void insertDataIntoData(SQLiteDatabase db)
{
try
{
InputStream is = context.getResources().openRawResource(R.raw.data);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String strLine = null;
while ((strLine = (br.readLine()).trim()) != null)
{
String[] temp = null;
ContentValues initialValues = new ContentValues();
initialValues.put(DATA_LANGTITUDE, temp[0]);
initialValues.put(DATA_LONGTITUDE, temp[1]);
db.insert(DATABASE_TABLE_2, null, initialValues);
}
is.close();
}
catch (Exception e)
{
Log.d(TAG_2, "Error while inserting common names into table");
}
}
}
这是我收到的错误:
01-23 18:20:39.465:E / Database(4837):android.database.sqlite.SQLiteException:没有这样的表:data :,同时编译:INSERT INTO data(pictures_longtitude,pictures_langtitude)VALUES(?,? );
希望所有人都能帮我解决问题,并指出我在代码中写的任何错误。 谢谢!
答案 0 :(得分:0)
从事物的外观来看,有一串叫做CREATE_DATABASE_TABLE_1
的SQL,它在onCreate
执行,但是没有CREATE_DATABASE_TABLE_2
字符串,而且它没有被执行数据库。
DATABASE_TABLE_2
已设置为"data"
,因此只需将CREATE TABLE
脚本放在onCreate
DataDBHelper
{{1}}上即可。
答案 1 :(得分:0)
在DataDBHelper.java的onCreate()方法中,您没有创建第二个表。
@Override
public void onCreate(SQLiteDatabase database)
{
database.execSQL(CREATE_DATABASE_TABLE_1);
Log.d("SaveData", "Created DB");
}
您需要在此处创建表格
@Override
public void onCreate(SQLiteDatabase database)
{
database.execSQL(CREATE_DATABASE_TABLE_1);
database.execSQL(CREATE_DATABASE_TABLE_2);
Log.d("SaveData", "Created DB");
}
CREATE_DATABASE_TABLE_2 =“我的sql stament for table 2”;
答案 2 :(得分:0)
您的onCreate仅为图片
创建了表格@Override
public void onCreate(SQLiteDatabase database) { database.execSQL(CREATE_DATABASE_TABLE_1);
Log.d("SaveData", "Created DB"); }
但是根据您的异常消息,您尝试插入数据
编译时:INSERT INTO 数据(pictures_file,pictures_count)VALUES(?,?);
如果你想插入数据表,也为数据添加create table,否则,你的表名传递错误的一些,检查它。
答案 3 :(得分:-2)
太多的代码来打扰阅读。
我敢打赌你没有连接到你认为的数据库,或者你还没有在你成功连接的数据库中创建表。检查两者。
您应该能够将持久性代码隔离到一个类并对其进行单元测试。如果没有,我会考虑重新设计以使其成为可能。