【问题标题】:Sqlite not inserting data in 2nd tableSqlite 不在第二个表中插入数据
【发布时间】:2017-04-16 06:13:33
【问题描述】:

这段代码在一张桌子上运行良好....并且正在附加文件 现在我想创建两个表,第一个活动是在 table1 中插入数据......但第二个活动没有插入数据......没有日志消息............在调用附加时它给出的日志如下所示:

      E/SQLiteLog: (1)

我的数据库类是

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME="GEOTAG.db";
public static final String TABLE_NAME1="Coordinates_table";
public static final String TABLE_NAME2="Form1_table";
public static final String CoL_1="ID";
public static final String CoL_2="LATITUDE";
public static final String CoL_3="LONGITUDE";
public static final String CoL_4="IDForm1";
public static final String CoL_5="Residence";
public static final String CoL_6="Gender";
public static final int DATABASE_VERSION = 3;
public static Context c;
Intent intent =null,chooser=null;
File file =null;
String myFile="Data";
String fpath;
String fileName;
FileOutputStream fileOutputStream=null;

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    c=context;

}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL("CREATE TABLE " + TABLE_NAME1 + " (" + CoL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CoL_2 +" TEXT,"+ CoL_3 +" TEXT)");
        db.execSQL("CREATE TABLE " + TABLE_NAME2 + " (" + CoL_4 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CoL_5 +" NTEXT,"+ CoL_6 +" NTEXT)");
    } catch (SQLException e) {
        Log.e("HEY","Error creating");
        e.printStackTrace();
    }

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    try{
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME1);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME2);
    onCreate(db);}
    catch (SQLException e){
        e.printStackTrace();
    }

}




public boolean insertData (String lat,String lng){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues =new ContentValues();
    contentValues.put(CoL_2,lat);
    contentValues.put(CoL_3,lng);

    long res =db.insert(TABLE_NAME1,null,contentValues);
    db.close();
    return res != -1;



}

public boolean insertForm1 (String a,String b){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues =new ContentValues();
    contentValues.put(CoL_5,a);
    contentValues.put(CoL_6,b);


    long res =db.insert(TABLE_NAME2,null,contentValues);
    db.close();
    return res != -1;



}


public void Attach()
{
    int id ;
    String latitude ;
    String longitude ;
    String residence ;
    String gender ;
    SQLiteDatabase db =this.getWritableDatabase();
    String[] columns={CoL_1, CoL_2, CoL_3,CoL_5,CoL_6};
    Cursor cursor1,cursor2;
    cursor1 = db.query(TABLE_NAME1,columns,null,null,null,null,null);
    cursor2 = db.query(TABLE_NAME2,columns,null,null,null,null,null);

    fileName= myFile+"." +"txt";
   // writing file on external storage
    try {
        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File(sdCard.getAbsolutePath() + "/Files");
        dir.mkdirs();
        if (dir.isDirectory()) {
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                new File(dir, children[i]).delete();
            }
        }
        file = new File(dir, fileName);
    }
    catch (Exception e){
        e.printStackTrace();
    }



    try {
        fileOutputStream = new FileOutputStream(file);
        fpath = file.toString();

    while (cursor1.moveToNext() ) {
        int index1 = cursor1.getColumnIndex(CoL_1);
        int index2 = cursor1.getColumnIndex(CoL_2);
        int index3 = cursor1.getColumnIndex(CoL_3);
        int index4 = cursor2.getColumnIndex(CoL_5);
        int index5 = cursor2.getColumnIndex(CoL_6);
        id = cursor1.getInt(index1);
        latitude = cursor1.getString(index2);
        longitude = cursor1.getString(index3);
        residence = cursor2.getString(index4);
        gender = cursor2.getString(index5);


            String text1 = Integer.toString(id) + " ";
            String text2 = latitude + " ";
            String text3 = longitude + " ";
            String text4 = residence + " ";
            String text5 = gender + "\n";

            fileOutputStream.write(text1.getBytes());
            fileOutputStream.write(text2.getBytes());
            fileOutputStream.write(text3.getBytes());
            fileOutputStream.write(text4.getBytes());
            fileOutputStream.write(text5.getBytes());




        Toast.makeText(c,"Wait while the file is being attached", Toast.LENGTH_LONG).show();


    }
        Toast.makeText(c,"Ready to Send", Toast.LENGTH_LONG).show();

        fileOutputStream.flush();
        fileOutputStream.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        fileOutputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}





}


public void SendData(){
    if(fpath!= null) {
    File targetFile = new File(fpath);
    Uri docUri = Uri.fromFile(targetFile);
        intent = new Intent(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_STREAM, docUri);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_TEXT, "Attached Data.txt");
        chooser = Intent.createChooser(intent, "Send Email....");
        c.startActivity(chooser);
    }
    else
    {
        Toast.makeText(c,"Please attach file before Sending", Toast.LENGTH_LONG).show();
    }
}


public void reset(){
    SQLiteDatabase db =this.getWritableDatabase();
    db.delete(TABLE_NAME1,null,null);
    db.delete(TABLE_NAME2,null,null);
    Toast.makeText(c,"Resetting Database", Toast.LENGTH_LONG).show();



}

}

我想将来自 8 个不同活动的数据保存在 8 个不同的表中,最后读取数据库并通过文本文件发送...还有其他方法吗?。

我已经尝试过,我创建了一个有 5 个 cloumns 的表...第一个活动是在前 3 列中插入数据,第二个活动是在第 4 和第 5 列中插入数据........但是它正在创建两行,第一行的最后两列为空值,第二行的前三列为空值.....我想要一行而不是两行

【问题讨论】:

    标签: android android-sqlite


    【解决方案1】:

    当您在同一行中插入数据时,您应该更新该行而不是再次调用插入。 例如:-

     ContentValues cv = new ContentValues();
    cv.put("Field1","value"); //These Fields should be your String values of 
    

    然后调用更新而不是插入

    myDB.update(TableName, cv, "_id="+id, null);
    

    你可以refer this

    【讨论】:

    • 当你输入数据时,对于已经有数据的行而不是插入使用更新,所以你不会有空值。
    • 正如你提到的,我试过但它没有更新。代码为:::>>> public int update(String Res,String Gen){ SQLiteDatabase db = this.getWritableDatabase();内容值内容值=新的内容值(); contentValues.put(CoL_4,Res); contentValues.put(CoL_5,Gen);字符串[] whereArgs={null}; int count= db.update(TABLE_NAME,contentValues,CoL_4+ " =? ", whereArgs);返回计数; }
    • 你的 whereArgs 是空的,你是否有任何唯一的行 ID 或任何其他唯一数据,你必须在 whereArgs 中传递唯一的 ID 以匹配数据库中的特定行
    • 我确实有唯一的 ID,但我不希望用户知道 ID ........如果 col4 为空,我想更新......不是基于 ID
    • 非常感谢您的帮助........此代码工作正常并正在更新......但更新现在返回 false...... .......代码在这里>>>> ........
    【解决方案2】:

    现在可以正常使用了

      public boolean update(String Res, String Gen){ SQLiteDatabase db = 
         this.getWritableDatabase(); ContentValues contentValues =new 
      ContentValues(); contentValues.put(CoL_4,Res); contentValues.put(CoL_5,Gen); 
     db.update(TABLE_NAME,contentValues, "Residence = ?",new String[] { "A" }); 
     return true; } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多