Einstellungen in der Datenbank speichern
Hallo Zusammen
Ich habe bisher meine Anwendungseinstellungen immer in den Local Storage gelegt. Da ich mittlerweilen auf eine Datenbank umgestiegen bin, würde ich gerne auch die Einstellungen dahin verschieben. Kennt jemand ein gutes Beispiel wie das aussehen könnte? Meine bisherige Logik adaptieren hatte leider sehr beschränkten Erfolg ^^
Ich hätte mir vorgestellt eine Tabelle zu machen mit einem Key und einem Value. Jedoch habe ich keinen sauberen Weg gefunden anschliessend darauf zuzugreifen.
Danke und Gruss
Nino
AW: Einstellungen in der Datenbank speichern
Was für eine Datenbank verwendest du denn? SQLite oder den SQL Server Compact via LINQ?
AW: Einstellungen in der Datenbank speichern
Den SQL Server Compact via LINQ.
Bisher hatte ich folgendes an Code um auf die Einstellungen bequem zugreifen zu können:
Code:
// Our isolated storage settings
IsolatedStorageSettings isolatedStore;
// The isolated storage key names of our settings
const string VersionKeyName = "VersionKeyName";
// The default value of our settings
const string VersionKeyDefault = "1.0";
public AppSettings()
{
try
{
// Get the settings for this application.
isolatedStore = IsolatedStorageSettings.ApplicationSettings;
}
catch
{
MessageBox.Show(AppResources.FehlerAllgemeinMeldung);
}
}
public bool AddOrUpdateValue(string Key, Object value)
{
bool valueChanged = false;
// If the key exists
if (isolatedStore.Contains(Key))
{
// If the value has changed
if (isolatedStore[Key] != value)
{
// Store the new value
isolatedStore[Key] = value;
valueChanged = true;
}
}
// Otherwise create the key.
else
{
isolatedStore.Add(Key, value);
valueChanged = true;
}
return valueChanged;
}
public valueType GetValueOrDefault<valueType>(string Key, valueType defaultValue)
{
valueType value;
// If the key exists, retrieve the value.
if (isolatedStore.Contains(Key))
{
value = (valueType)isolatedStore[Key];
}
// Otherwise, use the default value.
else
{
value = defaultValue;
}
return value;
}
public void Save()
{
isolatedStore.Save();
}
public string InstalledVersion
{
get
{
return GetValueOrDefault<string>(VersionKeyName, VersionKeyDefault);
}
set
{
AddOrUpdateValue(VersionKeyName, value);
Save();
}
}
Damti konnte ich bequem über die AppSettingsklasse auf die jeweiligen Properties zugreifen. Das würde ich jetzt gerne über eine entsprechende ViewModel Klasse machen die anschliessend auf die Datenbank geht.
AW: Einstellungen in der Datenbank speichern
Hi,
hier ein detailliertes Tutorial: http://msdn.microsoft.com/en-us/libr...vs.105%29.aspx
Viele Grüße,
Tamay Gündüz
AW: Einstellungen in der Datenbank speichern
Danke für den Link, aber ich suche eher eine Art BestPractice für den Zugriff auf eine Tabelle mit Settings als eine generelle Einführung in Linq-To-SQL.
AW: Einstellungen in der Datenbank speichern
Nunja, was du in der Datenbank speicherst ist ja völlig egal. Du machst einen dbcontext auf und greifst auf deine Daten zu.
Wenn es Settings sein sollen erstellst du dir entsprechend vorher die passende Tabelle. Ich sehe nicht ganz das Problem? Dir Vorgehensweise unterscheidet sich ja nur insofern vom speichern in einer anderen quelle (z.b. storagesettings) als das du einen anderen Datenprovider verwendest..
Zitat:
Zitat von
Nemoc
Ich hätte mir vorgestellt eine Tabelle zu machen mit einem Key und einem Value. Jedoch habe ich keinen sauberen Weg gefunden anschliessend darauf zuzugreifen
- Kannst du das Problem eventuell etwas spezifizieren?
AW: Einstellungen in der Datenbank speichern
das Problem insofern ist das du normalerweise eine Collection herausholst diese anzeigst, etwas auswählst und wieder speicherst. Bei Einstellungen willst du ja aber ganz konkrete Items aus der Collection. Und das vorzugsweise verfügbar über ein Settingsobject wie bei einem Property.
Weiss nicht genau ob es so verständlicher ist, aber mir fällt im Moment kein besserer Weg ein es zu beschreiben.
AW: Einstellungen in der Datenbank speichern
Also angenommen ich habe eine Tabelle
Code:
[Table]
public class SettingsItem : INotifyPropertyChanged, INotifyPropertyChanging
{
public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangingEventHandler PropertyChanging;
private string _settingsItemKey;
[Column(IsPrimaryKey = true, DbType = "NVarChar(100) NOT NULL", CanBeNull = false,
AutoSync = AutoSync.OnInsert)]
public string SettingsItemKey
{
get { return _settingsItemKey; }
set
{
if (_settingsItemKey != value)
{
NotifyPropertyChanging("SettingsItemKey");
_settingsItemKey = value;
NotifyPropertyChanged("SettingsItemKey");
}
}
}
private string _settingsItemVal;
[Column(IsPrimaryKey = false, DbType = "NVarChar(100)", CanBeNull = true,
AutoSync = AutoSync.OnInsert)]
public string SettingsItemVal
{
get { return _settingsItemVal; }
set
{
if (_settingsItemVal != value)
{
NotifyPropertyChanging("SettingsItemVal");
_settingsItemVal = value;
NotifyPropertyChanged("SettingsItemVal");
}
}
}
...
Diese habe ich dann vom Code aus generieren lassen und möchte jetzt einen Wert abfragen bzw. falls nicht existent einfügen
Code:
// insert if not existing
if (!db.SettingsItems.Any(item => item.SettingsItemKey == "Einstellung"))
{
var t = new SettingsItem() {SettingsItemKey = "Einstellung", SettingsItemVal = "meinWert"};
db.SettingsItems.InsertOnSubmit(t);
db.SubmitChanges();
}
// get from db
var selectedItem = db.SettingsItems.Single(item => item.SettingsItemKey == "Einstellung");
// notiz: myproperty hatte ich auf ein textblock gebindet .. ist nicht weiter relevant
MyProperty = selectedItem.SettingsItemKey + " -- " + selectedItem.SettingsItemVal;
Das dürfte genau den Einsatzzweck abdecken irgendwelche Settingwerte abzuspeichern, oder?
Ansonsten habe ich deine Frage wiederholt missverstanden und du müsstest mich aufklären ;)
Viele Grüße,
Tamay Gündüz
AW: Einstellungen in der Datenbank speichern
Das sieht vielversprechend aus. Probier ich nachher gleich mal aus, danke =)
AW: Einstellungen in der Datenbank speichern
Huhu
Mit Hilfe des obigen Beispiels und etwas suchen hab ichs hinbekommen. Der Code sieht nun so aus:
Definition der Einstellungen der Defaultwerte.
Code:
const string SETTING_KEYNAME = "SettingName";
const double SETTING_KEYDEFAULT = 8;
Methoden zum setzten und auslesen der Einstellungen
Code:
public void AddOrUpdateValue(string key, Object value)
{
if (!db.Settings.Any(item => item.Key == key))
{
var t = new Setting() { Key = key, Value = value.ToString() };
db.Settings.InsertOnSubmit(t);
db.SubmitChanges();
}
}
public valueType GetValueOrDefault<valueType>(string key, valueType defaultValue)
{
valueType value;
if (db.Settings.Any(item => item.Key == key))
{
var selectedItem = db.Settings.Single(item => item.Key == key);
value = (valueType)Convert.ChangeType(selectedItem.Value, typeof(valueType), CultureInfo.InvariantCulture);
}
else
{
value = defaultValue;
}
return value;
}
public double SettingName
{
get
{
return GetValueOrDefault<double>(SETTING_KEYNAME, SETTING_KEYDEFAULT);
}
set
{
AddOrUpdateValue(SETTING_KEYNAME, value);
}
}
(Sorry für die unschöne Formatierung ;) )
Danke für die Hilfe! =)
Gruss
Nino