2012-12-14 34 views
0

我一直在想,为什么当我将相同的数据(Double类型的数组)插入SOP(sys.out.println)上的同一个db/table时,为什么我会得到“null(s)”? t设置任何约束。

我怀疑“空”进入我的桌子,但这怎么可能?我第一次插入它工作正常,但只要我尝试再次插入相同的值(运行我的应用程序第二次)的值,我得到的SOP的输出上的logcat为:插入和获取真正的数据类型从SQLite获取连续插入的空值?

12-14 13:24:43.788: I/System.out(763): 28.0 
12-14 13:24:43.788: I/System.out(763): null 
12-14 13:24:43.797: I/System.out(763): The data was added successfully! 
12-14 13:24:43.797: I/System.out(763): Data Totals = 2 

我DBAdapter.java外观像这样:

package com.profourth.line; 

import java.util.Random; 

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

public class DBAdapter { 
    int id = 0; 
    public static final String KEY_PHID = "phID"; 
    public String KEY_LAT = "LATS"; 
    public String KEY_LON = "LONS"; 
    private static final String TAG = "DBAdapter"; 

    private static final String DATABASE_NAME = "PROdb"; 
    private static final String DATABASE_TABLE = "myPROmapData"; 
    private static final int DATABASE_VERSION = 2; 

    private static final String DATABASE_CREATE = "create table myPROmapData (phID integer, LATS real, LONS real);"; 

    private final Context context; 

    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(DATABASE_CREATE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS myPROmapData"); 
      onCreate(db); 
     } 
    } 

    // ---opens the database--- 
    public DBAdapter open() throws SQLException { 
     db = DBHelper.getWritableDatabase(); 
     return this; 
    } 

    // ---closes the database--- 
    public void close() { 
     DBHelper.close(); 
    } 

    // ---insert a title into the database--- 
    public long insertQuote(/* String Quote */) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_PHID, 100); 
     initialValues.put(KEY_LAT, 28.00); 
     initialValues.put(KEY_LON, 72.00); 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    public int getAllEntries() { 
     Cursor cursor = db.rawQuery("SELECT COUNT(LATS) FROM myPROmapData", 
       null); 
     if (cursor.moveToFirst()) { 
      return cursor.getInt(0); 
     } 
     return cursor.getInt(0); 

    } 

    public Double[] Populate() { 
     Double[] myLats; 
     Double[] myLons; 
     id = getAllEntries(); 
     /* 
     * Random random = new Random(); int rand = 
     * random.nextInt(getAllEntries()); if(rand == 0) ++rand; 
     */ 
     Cursor cursor = db.rawQuery("SELECT LATS FROM myPROmapData", null); 
     /* 
     * if(cursor.moveToFirst()) { //return cursor.getString(0); } //return 
     * cursor.getString(0); return myLats; 
     */ 

     Double data[] = new Double[cursor.getCount()]; 

     if (cursor != null) { 

      while (cursor.moveToNext()) { 
       int j = 0; 
       while (j < cursor.getColumnCount()) { 
        // data[j] = cursor.getString(j); 
        data[j] = cursor.getDouble(j); 
        j++; 
       } 

       cursor.moveToNext(); 
      } 
      cursor.close(); 
     } 
     return data; 

    } 

} 

和我的活动是这样的:

package com.profourth.line; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.view.Menu; 
import android.widget.Toast; 

public class MapDataController extends Activity { 

    DBAdapter db = new DBAdapter(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map_data_controller); 

     /*MapDataHandler dbh = new MapDataHandler(this);          
     SQLiteDatabase db = dbh.getWritableDatabase(); 

     MapDataHandler handlemydata = new MapDataHandler(null); 
     handlemydata.onCreate(db); 
     handlemydata.AddRows(); 
     handlemydata.PopulateArr(); 
     db.close();*/ 

     db.open(); 
     long id = 0; 
     db.insertQuote(); 
     id = db.getAllEntries(); 

     Double[] dta = null; 
     dta = db.Populate(); 
     for(int z=0;z<(dta.length);z++) 
     { 
      System.out.println(dta[z]); 
     } 

     //Context context = getApplicationContext(); 
     CharSequence text = "The data was added successfully!\nData Totals = " + id; 
     /*int duration = Toast.LENGTH_LONG; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show();*/ 
     System.out.println(text); 
     //Quote.setText(""); 
     db.close(); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_map_data_controller, menu); 
     return true; 
    } 

} 

任何帮助深表感谢。感谢您的阅读..

解决: 这是我更新的填充()方法:

public Double[] Populate() { 
     Double[] myLats; 
     Double[] myLons; 
     //Double[] data = null; 

     id = getAllEntries(); 
     /* 
     * Random random = new Random(); int rand = 
     * random.nextInt(getAllEntries()); if(rand == 0) ++rand; 
     */ 
     int columnIndex = 0; 
     Cursor cursor = db.rawQuery("SELECT LATS FROM myPROmapData", null); 
     /* 
     * if(cursor.moveToFirst()) { //return cursor.getString(0); } //return 
     * cursor.getString(0); return myLats; 
     */ 

     Double data[] = new Double[cursor.getCount()]; 
     if (cursor.moveToFirst()) 
     {      
      for (int i = 0; i < cursor.getCount(); i++) 
      { 
       data[i] = cursor.getDouble(columnIndex); 
       cursor.moveToNext(); 
      }   
     } 
     cursor.close(); 
return data; 
} 

回答

0

你的代码中有循环二moveToNext()调用,因此它读取每一秒值,并离开后半的数组为空。

+0

感谢您指出。那么,我仍然无法正常工作。看起来我必须从这个循环结构开始。有什么建议? – beerBear

+0

有没有其他方法可以对此进行编码?使用游标在性能方面有点沉重,不是吗? – beerBear

+0

游标是从数据库中获取数据的唯一方法。 –