SQL错误:没有这样的表

时间:2012-01-22 18:09:05

标签: android database eclipse sqlite

我目前正在尝试在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(?,? );

希望所有人都能帮我解决问题,并指出我在代码中写的任何错误。 谢谢!

4 个答案:

答案 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)

太多的代码来打扰阅读。

我敢打赌你没有连接到你认为的数据库,或者你还没有在你成功连接的数据库中创建表。检查两者。

您应该能够将持久性代码隔离到一个类并对其进行单元测试。如果没有,我会考虑重新设计以使其成为可能。